class_docstr: Shadow module attaches the float module to its matching quantized module
  as the shadow. Then it uses Logger module to process the outputs of both
  modules.
  
  Args:
      q_module: module quantized from float_module that we want to shadow
      float_module: float module used to shadow q_module
      logger_cls: type of logger used to process the outputs of q_module and
          float_module. ShadowLogger or custom loggers can be used.
docstr_tok: []
code: def add_relu(self, x: torch.Tensor, y: torch.Tensor) -> torch.Tensor:
      """ """  # blank docblock to make autodoc happy
      output = self.orig_module.add_relu(x, y)
      x = x.dequantize()
      y = y.dequantize()
      shadow_output = self.shadow_module.add_relu(x, y)
      self.logger(output, shadow_output)
      return output
  
imports: import torch
  import torch.nn
  import torch.ao.nn.quantized
  import torch.ao.nn.quantized.dynamic
  from torch.ao.quantization import prepare
  from typing import Dict, List, Optional, Any, Union, Callable, Set
  from torch.ao.quantization.quantization_mappings import get_default_compare_output_module_list
label_desc: Use image node_id 8 for calling the Shadow obj's underlying member method code with example usage: obj.add_relu(x, y) and returns: output