class_docstr: Cyclic LR Scheduler.
  
  Implement the cyclical learning rate policy (CLR) described in
  https://arxiv.org/pdf/1506.01186.pdf
  
  Different from the original paper, we use cosine annealing rather than
  triangular policy inside a cycle. This improves the performance in the
  3D detection area.
  
  Args:
      by_epoch (bool): Whether to update LR by epoch.
      target_ratio (tuple[float]): Relative ratio of the highest LR and the
          lowest LR to the initial LR.
      cyclic_times (int): Number of cycles during training
      step_ratio_up (float): The ratio of the increasing process of LR in
          the total cycle.
      anneal_strategy (str): {'cos', 'linear'}
          Specifies the annealing strategy: 'cos' for cosine annealing,
          'linear' for linear annealing. Default: 'cos'.
code: def get_lr(self, runner, base_lr):
      curr_iter = runner.iter
      for (
          start_iter,
          end_iter,
          max_iter_per_phase,
          start_ratio,
          end_ratio,
      ) in self.lr_phases:
          curr_iter %= max_iter_per_phase
          if start_iter <= curr_iter < end_iter:
              progress = curr_iter - start_iter
              return self.anneal_func(
                  base_lr * start_ratio,
                  base_lr * end_ratio,
                  progress / (end_iter - start_iter),
              )
  
imports: import numbers
  from math import cos, pi
  import annotator.uniformer.mmcv
  from .hook import HOOKS, Hook
label_desc: Use image node_id 3 for calling the CyclicLrUpdaterHook obj's underlying member method code with example usage: obj.get_lr(runner, base_lr) and returns: self