code: def run(self, *args, **kwargs):
      self.nargs = dict(zip(self.arg_names, args))
      if len(self.configs) > 1:
          all_args = {**self.nargs, **kwargs}
          _args = []
          for name in self.arg_names:
              if name in all_args:
                  _args.append(all_args[name])
          key = [_args[i] for i in self.key_idx]
          for arg in _args:
              if hasattr(arg, "dtype"):
                  key.append(str(arg.dtype))
          key = tuple(key)
          if key not in self.cache:
              # prune configs
              pruned_configs = self.prune_configs(kwargs)
              bench_start = time.time()
              timings = {
                  config: self._bench(*args, config=config, **kwargs)
                  for config in pruned_configs
              }
              bench_end = time.time()
              self.bench_time = bench_end - bench_start
              self.cache[key] = builtins.min(timings, key=timings.get)
              self.pre_hook(args, reset_only=True)
              self.configs_timings = timings
          config = self.cache[key]
      else:
          config = self.configs[0]
      self.best_config = config
      full_nargs = {**self.nargs, **kwargs, **self.best_config.kwargs}
      if config.pre_hook is not None:
          config.pre_hook(full_nargs)
      ret = self.fn.run(
          *args,
          num_warps=config.num_warps,
          num_stages=config.num_stages,
          num_ctas=config.num_ctas,
          enable_warp_specialization=config.enable_warp_specialization,
          **kwargs,
          **config.kwargs,
      )
      self.nargs = None
      return ret
  
imports: from __future__ import annotations
  import builtins
  import time
  from typing import Dict
  from ..testing import do_bench
  from .jit import KernelInterface
label_desc: Use image node_id 3 for calling the Autotuner obj's underlying member method code with example usage: obj.run() and returns: ret