class_docstr: Propagate qnn.concat's quantization params to its inputs,
  and try to avoid redundant requantization while doing so.
  
  Replace
  def @main(%q1: Tensor[(1, 64, 35, 35), uint8],
      %q2: Tensor[(1, 64, 35, 35), uint8], %q3: Tensor[(1, 32, 35, 35), uint8]) {
      %0 = nn.max_pool2d(%q1, pool_size=[3, 3], padding=[1, 1, 1, 1], layout="NHWC");
      %1 = qnn.requantize(%q2, 0.000109401f, 0, 0.00345f, 0, axis=1, out_dtype="uint8");
      %2 = (%0, %1, %q3);
      %3 = (0.0425042f, 0.00345f, 0.0486874f);
      %4 = (0, 0, 0);
      qnn.concatenate(%2, %3, %4, 0.0486874f, 0, axis=1)
  }
  
  with
  
  def @main(%q1: Tensor[(1, 64, 35, 35), uint8],
      %q2: Tensor[(1, 64, 35, 35), uint8], %q3: Tensor[(1, 32, 35, 35), uint8]) {
      %0 = nn.max_pool2d(%q1, pool_size=[3, 3], padding=[1, 1, 1, 1], layout="NHWC");
      %1 = qnn.requantize(%0, 0.0425042f, 0, 0.0486874f, 0, axis=1, out_dtype="uint8");
      %2 = qnn.requantize(%q2, 0.000109401f, 0, 0.0486874f, 0, axis=1, out_dtype="uint8");
      %3 = (%1, %2, %q3);
      concatenate(%3, axis=1)
  }
class_docstr_tok: ["Propagate","qnn.concat","'s","quantization","params","to","its","inputs",",","and","try","to","avoid","redundant","requantization","while","doing","so",".","Replace","def","@","main","(","%","q1",":","Tensor","[","(","1",",","64",",","35",",","35",")",",","uint8","]",",","%","q2",":","Tensor","[","(","1",",","64",",","35",",","35",")",",","uint8","]",",","%","q3",":","Tensor","[","(","1",",","32",",","35",",","35",")",",","uint8","]",")","{","%","0","=","nn.max_pool2d","(","%","q1",",","pool_size=","[","3",",","3","]",",","padding=","[","1",",","1",",","1",",","1","]",",","layout=","''","NHWC","''",")",";","%","1","=","qnn.requantize","(","%","q2",",","0.000109401f",",","0",",","0.00345f",",","0",",","axis=1",",","out_dtype=","''","uint8","''",")",";","%","2","=","(","%","0",",","%","1",",","%","q3",")",";","%","3","=","(","0.0425042f",",","0.00345f",",","0.0486874f",")",";","%","4","=","(","0",",","0",",","0",")",";","qnn.concatenate","(","%","2",",","%","3",",","%","4",",","0.0486874f",",","0",",","axis=1",")","}","with","def","@","main","(","%","q1",":","Tensor","[","(","1",",","64",",","35",",","35",")",",","uint8","]",",","%","q2",":","Tensor","[","(","1",",","64",",","35",",","35",")",",","uint8","]",",","%","q3",":","Tensor","[","(","1",",","32",",","35",",","35",")",",","uint8","]",")","{","%","0","=","nn.max_pool2d","(","%","q1",",","pool_size=","[","3",",","3","]",",","padding=","[","1",",","1",",","1",",","1","]",",","layout=","''","NHWC","''",")",";","%","1","=","qnn.requantize","(","%","0",",","0.0425042f",",","0",",","0.0486874f",",","0",",","axis=1",",","out_dtype=","''","uint8","''",")",";","%","2","=","qnn.requantize","(","%","q2",",","0.000109401f",",","0",",","0.0486874f",",","0",",","axis=1",",","out_dtype=","''","uint8","''",")",";","%","3","=","(","%","1",",","%","2",",","%","q3",")",";","concatenate","(","%","3",",","axis=1",")","}"]
code: def __init__(self):
      super(simplify_qnn_concat_in_func, self).__init__()
      self.qvals = wildcard()
      self.scales = wildcard()
      self.zps = wildcard()
      self.out_scale = wildcard()
      self.out_zp = wildcard()
      self.pattern = is_op("qnn.concatenate")(
          self.qvals, self.scales, self.zps, self.out_scale, self.out_zp
      )
  
imports: import functools
  import numpy
  import tvm
  from tvm import relay
  from tvm.relay.dataflow_pattern import DFPatternCallback, is_constant, is_op, is_tuple, rewrite, wildcard
  from tvm.topi.utils import get_const_tuple
  from tvm.relay.expr import Call
  from tvm.runtime import ndarray
  from ..._ffi.registry import register_func
label_desc: Use image node_id 1 to create a new simplify_qnn_concat_in_func object from inherited base classes: DFPatternCallback with example: obj = simplify_qnn_concat_in_func()