class_docstr: Step LR scheduler with min_lr clipping.
  
  Args:
      step (int | list[int]): Step to decay the LR. If an int value is given,
          regard it as the decay interval. If a list is given, decay LR at
          these steps.
      gamma (float, optional): Decay LR ratio. Default: 0.1.
      min_lr (float, optional): Minimum LR value to keep. If LR after decay
          is lower than `min_lr`, it will be clipped to this value. If None
          is given, we don't perform lr clipping. Default: None.
code: def get_lr(self, runner, base_lr):
      progress = runner.epoch if self.by_epoch else runner.iter
  
      # calculate exponential term
      if isinstance(self.step, int):
          exp = progress // self.step
      else:
          exp = len(self.step)
          for i, s in enumerate(self.step):
              if progress < s:
                  exp = i
                  break
  
      lr = base_lr * (self.gamma**exp)
      if self.min_lr is not None:
          # clip to a minimum value
          lr = max(lr, self.min_lr)
      return lr
  
imports: import numbers
  from math import cos, pi
  import annotator.uniformer.mmcv
  from .hook import HOOKS, Hook
label_desc: Use image node_id 2 for calling the StepLrUpdaterHook obj's underlying member method code with example usage: obj.get_lr(runner, base_lr) and returns: lr