class_docstr: Input graph:
  input -----> transpose(axis=[1,0]) -----> transpose(axis=[1,0]) ---> out
  
  Output graph:
  input -----> identity -----> out
class_docstr_tok: ["Input","graph",":","input","--","--","-",">","transpose","(","axis=","[","1,0","]",")","--","--","-",">","transpose","(","axis=","[","1,0","]",")","--","-",">","out","Output","graph",":","input","--","--","-",">","identity","--","--","-",">","out"]
code: def test_concat_pattern_6(self):
      @mb.program(
          input_specs=[
              mb.TensorSpec(shape=(10, 20, 30)),
              mb.TensorSpec(shape=(30, 10, 20)),
          ]
      )
      def prog(x, y):
          x1 = mb.transpose(x=x, perm=[2, 0, 1])
          r1 = mb.relu(x=x1)
          r2 = mb.relu(x=x1)
          r3 = mb.relu(x=x1)
          r4 = mb.relu(x=x1)
          r5 = mb.relu(x=x1)
  
          x2 = mb.concat(values=[r1, r2, y], axis=0)
          x3 = mb.transpose(x=r3, perm=[1, 2, 0])
          x4 = mb.transpose(x=r4, perm=[1, 2, 0])
          x5 = mb.transpose(x=r5, perm=[1, 2, 0])
          return x2, x3, x4, x5
  
      prev_prog, prev_block, block = apply_pass_and_basic_check(
          prog, "common::reduce_transposes"
      )
      self.assertEqual(
          get_op_types_in_program(prev_prog),
          [
              "transpose",
              "relu",
              "relu",
              "relu",
              "relu",
              "relu",
              "concat",
              "transpose",
              "transpose",
              "transpose",
          ],
      )
      self.assertEqual(
          get_op_types_in_program(prog),
          [
              "relu",
              "relu",
              "relu",
              "relu",
              "relu",
              "transpose",
              "transpose",
              "concat",
          ],
      )
  
      assert_model_is_valid(
          prog,
          {"x": (10, 20, 30), "y": (30, 10, 20)},
          expected_output_shapes={
              block.outputs[0].name: (90, 10, 20),
              block.outputs[1].name: (10, 20, 30),
              block.outputs[2].name: (10, 20, 30),
              block.outputs[3].name: (10, 20, 30),
          },
      )
  
imports: import unittest
  import numpy
  import pytest
  from coremltools.converters.mil.mil import Builder
  from coremltools.converters.mil.mil import get_new_symbol
  from coremltools.converters.mil.mil.passes.defs.optimize_repeat_ops import TransformAxisUpdateOps
  from coremltools.converters.mil.mil.passes.pass_registry import PASS_REGISTRY
  from coremltools.converters.mil.testing_utils import apply_pass_and_basic_check, assert_model_is_valid, get_op_types_in_program
label_desc: Use image node_id 28 for calling the TransposeOptimizationPass obj's underlying member method code with example usage: obj.test_concat_pattern_6() and returns: x2,  x3,  x4,  x5