code: def notify_observers(self, **kwargs):
      for key, value in kwargs.items():
          if value is None:
              # Allow optional reporting
              continue
  
          assert key in self._observers, f"Unknown key: {key}"
  
          # TODO: Create a generic framework for type conversion
          if self._observable_value_types[key] == torch.Tensor:
              try:
                  if not isinstance(value, torch.Tensor):
                      value = torch.tensor(value)
                  if len(value.shape) == 0:
                      value = value.reshape(1)
                  value = value.detach()
              except Exception:
                  # Be lenient about conversion since ReporterBase
                  # has inaccurate type
                  pass
  
          for observer in self._observers[key]:
              observer.update(key, value)
  
file_path: ReAgent/reagent/core/tracker.py
imports: import functools
  import logging
  from typing import Dict, List, Type
  import torch
label_desc: Use image node_id 5 for calling the ObservableMixin obj's underlying member method code with example usage: obj.notify_observers() without return types