code: def save_indicators(self, file: Optional[PurePath] = None):
      if not self.is_indicators_updated:
          return
      self.is_indicators_updated = False
      if file is None:
          if self.__indicators_file is None:
              return
          file = self.__indicators_file
      else:
          self.__indicators_file = file
  
      wildcards = {
          k: ind.to_dict() for k, ind in self.dot_indicators.items()
      }
      inds = {k: ind.to_dict() for k, ind in self.indicators.items()}
      with open(str(file), "w") as file:
          file.write(
              util.yaml_dump(
                  {"wildcards": wildcards, "indicators": inds}
              )
          )
  
      for w in self.__writers:
          w.save_indicators(self.dot_indicators, self.indicators)
  
imports: from pathlib import PurePath
  from typing import Dict, List, Optional, Callable, Union, Tuple
  from labml import logger
  from .indicators import Indicator
  from .indicators.factory import load_indicator_from_dict, create_default_indicator
  from .indicators.numeric import Scalar
  from .namespace import Namespace
  from .writers import Writer
  from .writers.screen import ScreenWriter
  from ..None import util
  from ..lab import lab_singleton, LabYamlNotfoundError
  from ..logger import LogPart
  from ..util import strings
  from ..util.colors import StyleCode
label_desc: Use image node_id 12 for calling the Tracker obj's underlying member method code with example usage: obj.save_indicators(file) without return types