          elapsed = self._calculate_elapsed()
          message = (f"Elapsed: {elapsed} | "
                     f"Session Iterations: {self._train_stats['iterations']}  {message}")
          self._statusbar.progress_update(message, 0, False)
          logger.trace("Succesfully captured loss: %s", message)  # type:ignore[attr-defined]
          return True
  
      def _calculate_elapsed(self) -> str:
          """ Calculate and format time since training started
 
</s> remove     def _filename(self) -> str:
 </s> add     def model_dir(self) -> str:
        """ str: The full path to the model folder """
        return self._model_dir

    @property
    def filename(self) -> str: </s> remove     def save(self, is_exit: bool = False, force_save_optimizer: bool = False) -> None:
 </s> add     def save(self,
             is_exit: bool = False,
             force_save_optimizer: bool = False) -> None: </s> remove     def model_dir(self) -> str:
        """str: The full path to the model folder location. """
        return self._io._model_dir  # pylint:disable=protected-access
 </s> add     def io(self) -> IO:  # pylint:disable=invalid-name
        """ :class:`~plugins.train.model.io.IO`: Input/Output operations for the model """
        return self._io
        if not self._first_loss_seen:
            self._statusbar.set_mode("indeterminate")
            self._first_loss_seen = True

          elapsed = self._calculate_elapsed()
          message = (f"Elapsed: {elapsed} | "
                     f"Session Iterations: {self._train_stats['iterations']}  {message}")
        if not self._first_loss_seen:
            self._statusbar.set_mode("indeterminate")
            self._first_loss_seen = True

          self._statusbar.progress_update(message, 0, False)
          logger.trace("Succesfully captured loss: %s", message)  # type:ignore[attr-defined]
          return True
  
      def _calculate_elapsed(self) -> str:
          """ Calculate and format time since training started
keep keep add keep keep keep keep keep keep
 Learning Rate finder (#1341)

* Add LR Finder support structure

* Move trainer.Feeder to lib.training.generator

* Expose model.io

* Add lr_finder

* Update docs and locales

* Pre-PR fixups
  - Fix training graph not displaying
  - CI fixes
  - Switch lr finder progress to tqdm
  - Exit lr finder early on NaN
  - Display lr finder progress in GUI 
lib/gui/wrapper.py