          """ Output the summary of the model and all sub-models to the verbose logger. """
          if hasattr(self._args, "summary") and self._args.summary:
              print_fn = None  # Print straight to stdout
          else:
              print_fn = lambda x: logger.verbose("%s", x)  # print to logger
          for model in _get_all_sub_models(self._model):
              model.summary(print_fn=print_fn)
  
      def save(self):
          """ Save the model to disk.
 
</s> remove     if d_type == float:
 </s> add     if isinstance(round_to, list):
        # Lock to nearest item
        var.set(min(round_to, key=lambda x: abs(x-float(value))))
    elif d_type == float: </s> remove         rounding:  [partial] For <class 'int'> and <class 'float'> datatypes this is
 </s> add         rounding:  [partial] For <class 'int'> and <class 'float'> data types this is </s> remove         The losses are then into a total for each side. Loss totals are added to
 </s> add         The losses are summed into a total for each side. Loss totals are added to
            # print to logger
            print_fn = lambda x: logger.verbose("%s", x)  # noqa
          """ Output the summary of the model and all sub-models to the verbose logger. """
          if hasattr(self._args, "summary") and self._args.summary:
              print_fn = None  # Print straight to stdout
          else:
            # print to logger
            print_fn = lambda x: logger.verbose("%s", x)  # noqa
          for model in _get_all_sub_models(self._model):
              model.summary(print_fn=print_fn)
  
      def save(self):
          """ Save the model to disk.
keep keep keep keep replace keep keep keep keep keep
 Training updates:
  - Expose optimizer epsilon param
  - Add NaN protection
GUI - slider - add support for discreet values 
plugins/train/model/_base.py