code: def testReconstructInputsAndOutputs(self, input_type, output_type):
      a1 = Artifact(id=1, name="a1")
      a2 = Artifact(id=2, name="a2")
      b = Artifact(id=3, name="b")
      c1 = Artifact(id=4, name="c1")
      c2 = Artifact(id=5, name="c2")
      d = Artifact(id=6, name="d")
  
      inputs, outputs = event_lib.reconstruct_inputs_and_outputs(
          artifacts=[a1, a2, b, c1, c2, d],
          events=[
              Event(
                  type=input_type,
                  artifact_id=a1.id,
                  path=valid_path("a", 0),
              ),
              Event(
                  type=input_type,
                  artifact_id=a2.id,
                  path=valid_path("a", 1),
              ),
              Event(
                  type=input_type,
                  artifact_id=b.id,
                  path=valid_path("b", 0),
              ),
              Event(
                  type=output_type,
                  artifact_id=c1.id,
                  path=valid_path("c", 0),
              ),
              Event(
                  type=output_type,
                  artifact_id=c2.id,
                  path=valid_path("c", 1),
              ),
              Event(
                  type=output_type,
                  artifact_id=d.id,
                  path=valid_path("d", 0),
              ),
          ],
      )
      self.assertEqual(inputs, {"a": [a1, a2], "b": [b]})
      self.assertEqual(outputs, {"c": [c1, c2], "d": [d]})
  
imports: import itertools
  from absl.testing import parameterized
  import tensorflow
  from tfx.orchestration.portable.mlmd import event_lib
  from ml_metadata.proto import metadata_store_pb2
label_desc: Use image node_id 11 for calling the EventLibTest obj's underlying member method code with example usage: obj.testReconstructInputsAndOutputs(input_type, output_type) without return types