docstr: Save the Experiment description as a .json file, named after :attr:`experiment_id`. If
  :attr:`do_full_save` is a callable and returns False when given the description object, the
  result recording loop will be broken, and the remaining result files will not be saved
  
  Returns
  -------
  'break'
      This string will be returned if :attr:`do_full_save` is a callable and returns False
      when given the description object. This is the signal for
      :class:`recorders.RecorderList` to stop recording result files
docstr_tok: ["Save","the","Experiment","description","as","a",".json","file",",","named","after",":","attr",":","`","experiment_id","`",".","If",":","attr",":","`","do_full_save","`","is","a","callable","and","returns","False","when","given","the","description","object",",","the","result","recording","loop","will","be","broken",",","and","the","remaining","result","files","will","not","be","saved","Returns","--","--","--","-","'break'","This","string","will","be","returned","if",":","attr",":","`","do_full_save","`","is","a","callable","and","returns","False","when","given","the","description","object",".","This","is","the","signal","for",":","class",":","`","recorders.RecorderList","`","to","stop","recording","result","files"]
code: def save_result(self):
      """Save the Experiment description as a .json file, named after :attr:`experiment_id`. If
      :attr:`do_full_save` is a callable and returns False when given the description object, the
      result recording loop will be broken, and the remaining result files will not be saved
  
      Returns
      -------
      'break'
          This string will be returned if :attr:`do_full_save` is a callable and returns False
          when given the description object. This is the signal for
          :class:`recorders.RecorderList` to stop recording result files
      """
      try:
          write_json(
              f"{self.result_path}/{self.experiment_id}.json",
              self.result,
              do_clear=False,
          )
      except FileNotFoundError:
          make_dirs(self.result_path, exist_ok=False)
          write_json(
              f"{self.result_path}/{self.experiment_id}.json",
              self.result,
              do_clear=False,
          )
  
      if (self.do_full_save is not None) and (
          not self.do_full_save(self.result)
      ):
          G.warn(
              "Breaking result-saving loop early! Remaining result files will not be saved"
          )
          return "break"
  
imports: from hyperparameter_hunter.data import OOFDataset, HoldoutDataset, TestDataset
  from hyperparameter_hunter.i_o.exceptions import EnvironmentInactiveError, EnvironmentInvalidError
  from hyperparameter_hunter.i_o.leaderboards import GlobalLeaderboard
  from hyperparameter_hunter.settings import G
  from hyperparameter_hunter.utils.file_utils import write_json, add_to_json, make_dirs, read_json
  from hyperparameter_hunter.utils.file_utils import RetryMakeDirs
  from hyperparameter_hunter.utils.general_utils import subdict
  from abc import ABCMeta, abstractmethod
  from collections import OrderedDict
  from platform import node
  import shutil
  from sys import exc_info
label_desc: Use image node_id 2 for calling the DescriptionRecorder obj's underlying member method code with example usage: obj.save_result() and returns: str