class_docstr: Specify the properties of an operator and
  construct the value combination of the arguments
  e.g., ldtype=["float32", "int32"], rdtype=["float16", "int16"],
  then the argument combination is
  [
      {"ldtype": "float32", "rdtype": "float16"},
      {"ldtype": "float32", "rdtype": "int16"},
      {"ldtype": "int32", "rdtype": "float16"},
      {"ldtype": "int32", "rdtype": "int16"},
  ]
  
  Parameters
  ----------
  func : function
       The function to define the operator (in tvm compute and schedule).
       It will get the argument combination extracted by this class.
  name : str
       function name.
  target : str
       {"cpu", "gpu", "cuda"}
  auto_broadcast : bool
       auto_broadcast=True allows one to implement broadcast computation
       without considering whether dimension size equals to one.
       TVM maps buffer[i][j][k] -> buffer[i][0][k] if dimension i's shape equals 1.
code: def __init__(self, func, name, target, auto_broadcast, **kwargs):
      # construct the value combination of the arguments
      # e.g., ldtype=["float32", "int32"], rdtype=["float16", "int16"]
      # arg_combination = [
      #   {"ldtype": "float32", "rdtype": "float16"},
      #   {"ldtype": "float32", "rdtype": "int16"},
      #   {"ldtype": "int32", "rdtype": "float16"},
      #   {"ldtype": "int32", "rdtype": "int16"},
      # ]
      self.attrs = kwargs.pop("attrs", [])
      self.attrs_valid = kwargs.pop(
          "attrs_valid", lambda **kwargs: True
      )
      args = [k for k in kwargs]
      values = [
          kwargs[k]
          if isinstance(kwargs[k], (list, tuple))
          else [kwargs[k]]
          for k in args
      ]
      cart_product = product(*values)
      self.arg_combination = [
          {k: v for k, v in zip(args, comb_values)}
          for comb_values in cart_product
      ]
      self.func = func
      self.name = name
      self.target = target
      self.auto_broadcast = auto_broadcast
      self.dispatchable = (
          "fallback" in inspect.signature(self.func).parameters
      )
  
file_path: mxnet/contrib/tvmop/opdef.py
imports: import tvm
  import inspect
  from tvm import autotvm
  from itertools import product
label_desc: Use image node_id 1 to create a new OpDef object  with example: obj = OpDef(func, name, target, auto_broadcast)