code: def propagate_from_low_bit_predecessor(
      layer, out2layer, default_precision=trt.float16
  ):
      """
      Returns
      -------
      layer precision
          current layer's precision
      (min, max)
          dynamic range of current layer's output tensor
      """
      dynamic_range = None
      tensor = layer.get_input(0)
      if tensor is not None:
          predecessor = out2layer[tensor.name]
          # NOTE: only support int8 for now
          if predecessor.get_output_type(0) == trt.int8:
              dynamic_range = tensor.dynamic_range
  
      if layer.name[0:4] == "Relu":
          assert dynamic_range is not None
          return trt.int8, (0, dynamic_range[1])
      elif layer.name[0:3] == "Add":
          # assert dynamic_range is not None
          return trt.int32, None
      else:
          logger.warning(
              f"set op {layer.name} to default precision {default_precision}"
          )
          return default_precision, None
  
imports: import time
  import logging
  import tensorrt
  import numpy
  import torch
  from .None import frontend_to_onnx
  from .None import trt_pycuda
  from .backend import BaseModelSpeedup
label_desc: Use image node_id 5 for calling a global function with example usage: propagate_from_low_bit_predecessor(layer, out2layer, default_precision) and returns: trt,  int,  dynamic_range, trt,  None, default_precision,  None