      def model_exists(self) -> bool:
          """ bool: ``True`` if a model of the type being loaded exists within the model folder
          location otherwise ``False``.
          """
          return os.path.isfile(self._filename)
  
      @property
      def history(self) -> list[list[float]]:
          """ list: list of loss histories per side for the current save iteration. """
          return self._history
 
</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 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 </s> remove     def save(self, is_exit: bool = False) -> None:
        """ Save the model to disk.

        Saves the serialized model, with weights, to the folder location specified when
        initializing the plugin. If loss has dropped on both sides of the model, then
        a backup is taken.

        Parameters
        ----------
        is_exit: bool, optional
            ``True`` if the save request has come from an exit process request otherwise ``False``
            Default: ``False``
        """
        self._io.save(is_exit=is_exit)

    def snapshot(self) -> None:
        """ Creates a snapshot of the model folder to the models parent folder, with the number
        of iterations completed appended to the end of the model name. """
        self._io.snapshot()

 </s> add 
        return os.path.isfile(self.filename)
      def model_exists(self) -> bool:
          """ bool: ``True`` if a model of the type being loaded exists within the model folder
          location otherwise ``False``.
          """
        return os.path.isfile(self.filename)
  
      @property
      def history(self) -> list[list[float]]:
          """ list: list of loss histories per side for the current save iteration. """
          return self._history
keep keep keep keep replace 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 
plugins/train/model/_base/io.py