def test_binary_op_with_non_constant_input4(self):
        """
        Input graph:
                                                                input (shape=(3,s,2))
                                                                     |
        input (shape=(1,3,4,2)) --> transpose (shape=(4,3,1,2)) --> add --> transpose --> relu

        Output graph: same as input graph since the non-transpose input of the add op has symbolic shape
        """

        @mb.program(
            input_specs=[
                mb.TensorSpec(shape=(1, 3, 4, 2)),
                mb.TensorSpec(shape=(3, get_new_symbol(), 2)),
            ]
        )
        def prog(x, y):
            x = mb.transpose(x=x, perm=[2, 1, 0, 3])
            x = mb.add(x=x, y=y)
            x = mb.transpose(x=x, perm=[2, 1, 0, 3])
            x = mb.relu(x=x)
            return x

        pass_name = "common::reduce_transposes"
        PASS_REGISTRY[pass_name](prog)
        self.assertEqual(get_op_types_in_program(prog), ["transpose", "add", "transpose", "relu"])
        block = prog.functions["main"]
        assert_model_is_valid(
            prog,
            {"x": (1, 3, 4, 2), "y": (3, 10, 2)},
            expected_output_shapes={block.outputs[0].name: (10, 3, 4, 2)},
        )

        Input graph:
                                                                input (shape=(3,s,2))
                                                                     |
        input (shape=(1,3,4,2)) --> transpose (shape=(4,3,1,2)) --> add --> transpose --> relu

        Output graph: same as input graph since the non-transpose input of the add op has symbolic shape
        
coremltools/converters/mil/mil/passes/tests/test_reduce_transposes_pass.py