class_docstr: QNN concatenate test class
docstr: Test qnn.concatenate
docstr_tok: ["Test","qnn.concatenate"]
code: def test_qnn_concatenate(self, hexagon_session: Session):
      """Test qnn.concatenate"""
      x_shape = [1, 64]
      y_shape = [2, 64]
      z_shape = [3, 64]
      input_x = relay.var("x", shape=x_shape, dtype="uint8")
      input_y = relay.var("y", shape=y_shape, dtype="uint8")
      input_z = relay.var("z", shape=z_shape, dtype="uint8")
  
      op = relay.qnn.concatenate(
          (input_x, input_y, input_z),
          input_scales=(
              relay.const(0.3),
              relay.const(0.7),
              relay.const(1.3),
          ),
          input_zero_points=(
              relay.const(0),
              relay.const(1),
              relay.const(2),
          ),
          output_scale=relay.const(0.8),
          output_zero_point=relay.const(5),
          axis=0,
      )
      relay_mod = tvm.IRModule.from_expr(op)
  
      inputs = {
          "x": np.arange(0, 64, 1, dtype="uint8").reshape(x_shape),
          "y": np.arange(0, 128, 1, dtype="uint8").reshape(y_shape),
          "z": np.arange(0, 192, 1, dtype="uint8").reshape(z_shape),
      }
  
      run_and_compare(hexagon_session, relay_mod, inputs, atol=1)
  
imports: import numpy
  import tvm.testing
  import tvm.topi.testing
  from tvm import relay
  from tvm.contrib.hexagon.session import Session
  from tvm.contrib.hexagon.pytest_plugin import HEXAGON_AOT_LLVM_TARGET
  from tvm.relay.backend import Executor
  from tvm.relay.testing import run_opt_pass, run_infer_type
  from .infrastructure import quantize_np
label_desc: Use image node_id 1 for calling the TestQnnConcatenate obj's underlying member method code with example usage: obj.test_qnn_concatenate(hexagon_session) without return types