class_docstr: Track side effects (list mutation, setattr, etc) that need to be
  applied after an FX graph is run.
class_docstr_tok: ["Track","side","effects","(","list","mutation",",","setattr",",","etc",")","that","need","to","be","applied","after","an","FX","graph","is","run","."]
code: def apply(self, fn, cache=None, skip_fn=lambda _: False):
      if cache is None:
          cache = dict()
  
      self.id_to_variable = {
          k: VariableTracker.apply(fn, v, cache, skip_fn)
          for k, v in self.id_to_variable.items()
      }
      self.store_attr_mutations = {
          k: VariableTracker.apply(fn, v, cache, skip_fn)
          for k, v in self.store_attr_mutations.items()
      }
      self.save_for_backward = VariableTracker.apply(
          fn, self.save_for_backward, cache, skip_fn
      )
      self.tensor_hooks = VariableTracker.apply(
          fn, self.tensor_hooks, cache, skip_fn
      )
  
imports: import inspect
  from typing import Any, Dict, List, Optional, Union
  import torch.nn
  from .None import utils, variables
  from .bytecode_transformation import create_call_function, create_call_method, create_instruction
  from .codegen import PyCodegen
  from .exc import unimplemented
  from .source import LocalSource, Source
  from .utils import nn_module_new, object_new
  from .variables.base import is_side_effect_safe, MutableLocalBase, MutableLocalSource, VariableTracker
label_desc: Use image node_id 5 for calling the SideEffects obj's underlying member method code with example usage: obj.apply(fn, cache, skip_fn) without return types