code: def assert_output_dtype_equal(self, expected_res, prop_graph):
      actual_dtype = self.node_output_dtypes(prop_graph)
      if len(actual_dtype) == 1:
          # For len=1, there is no tuple packing for expected_res.
          self.assert_tensor_dtype_equal(expected_res, actual_dtype[0])
      else:
          self.assertEqual(len(expected_res), len(actual_dtype))
          for expected, actual in zip(expected_res, actual_dtype):
              self.assert_tensor_dtype_equal(expected, actual)
  
imports: from itertools import product
  from typing import Tuple
  from unittest.case import expectedFailure
  import torch
  from torch import complex32, float32, float64, int32, int64
  from torch.jit._passes import _property_propagation
  from torch.testing._internal.common_methods_invocations import SampleInput, sample_inputs_adaptive_avg_pool2d, sample_inputs_conv2d
  from torch.testing._internal.common_utils import set_default_dtype, first_sample
  from torch.testing._internal.jit_utils import JitTestCase
  from torch.testing._internal.jit_metaprogramming_utils import create_traced_fn
  from torch.testing._internal.common_device_type import ops, instantiate_device_type_tests
  from torch.testing._internal.common_methods_invocations import op_db
label_desc: Use image node_id 1 for calling the TestDtypeCustomRules obj's underlying member method code with example usage: obj.assert_output_dtype_equal(expected_res, prop_graph) without return types