class_docstr: An utility class to cache the shape inference of ``conv`` and ``pool`` op.
  The cache mechanism makes sure ops with the same input shape (symbolic also),
  and params (``pad, stride, kernel``) would produce the same output shape.
class_docstr_tok: ["An","utility","class","to","cache","the","shape","inference","of","``","conv","``","and","``","pool","``","op",".","The","cache","mechanism","makes","sure","ops","with","the","same","input","shape","(","symbolic","also",")",",","and","params","(","``","pad",",","stride",",","kernel","``",")","would","produce","the","same","output","shape","."]
code: def get_cache_key(
      input_shape: Tuple[int],
      pad_type: str,
      pad: Tuple[int],
      strides: Tuple[int],
      kernel: Tuple[int],
      ceil_mode: bool,
  ) -> Tuple[Tuple]:
      return (
          ("input_shape", input_shape),
          ("pad_type", pad_type),
          ("pad", pad),
          ("strides", strides),
          ("kernel", kernel),
          ("ceil_mode", ceil_mode),
      )
  
imports: import math
  import numbers
  from typing import List, Tuple
  import numpy
  from coremltools.converters.mil.mil import Builder
  from coremltools.converters.mil.mil import Var, get_new_symbol, types
  from coremltools.converters.mil.mil.ops.defs.iOS15.elementwise_unary import cast
  from coremltools.converters.mil.mil.types import builtin_to_string, promote_dtypes
  from coremltools.converters.mil.mil.types.symbolic import is_symbolic
label_desc: Use image node_id 1 for calling the ConvPoolingTypeInferenceCache obj's underlying member method code with example usage: obj.get_cache_key(input_shape, pad_type, pad, strides, kernel, ceil_mode) and returns: str,  input_shape,  str,  pad_type,  str,  pad,  str,  strides,  str,  kernel,  str,  ceil_mode