code: def test_concat_add_axis(self, tensor_splits, gc, dc):
      axis, _, splits = tensor_splits
  
      op = core.CreateOperator(
          "Concat",
          ["X_{}".format(i) for i in range(len(splits))],
          ["concat_result", "split_info"],
          axis=axis,
          add_axis=1,
      )
  
      self.assertReferenceChecks(
          gc,
          op,
          splits,
          lambda *splits: (
              np.concatenate(
                  [np.expand_dims(a, axis) for a in splits], axis=axis
              ),
              np.array([1] * len(splits)),
          ),
          ensure_outputs_are_inferred=True,
      )
      self.assertDeviceChecks(dc, op, splits, [0, 1])
      for i in range(len(splits)):
          self.assertGradientChecks(
              gc,
              op,
              splits,
              i,
              [0],
              ensure_outputs_are_inferred=True,
          )
  
file_path: pytorch/caffe2/python/operator_test/concat_split_op_test.py
imports: from caffe2.python import core
  import caffe2.python.hypothesis_test_util
  import caffe2.python.serialized_test.serialized_test_util
  from hypothesis import given, settings
  import hypothesis.strategies
  import numpy
  import unittest
label_desc: Use image node_id 2 for calling the TestConcatSplitOps obj's underlying member method code with example usage: obj.test_concat_add_axis(tensor_splits, gc, dc) without return types