class_docstr: Reduce the learning rate by given a list of steps.
  
  Assume there exists *k* such that::
  
     step[k] <= num_update and num_update < step[k+1]
  
  Then calculate the new learning rate by::
  
     base_lr * pow(factor, k+1)
  
  Parameters
  ----------
  step: list of int
      The list of steps to schedule a change
  factor: float
      The factor to change the learning rate.
  warmup_steps: int
      number of warmup steps used before this scheduler starts decay
  warmup_begin_lr: float
      if using warmup, the learning rate from which it starts warming up
  warmup_mode: string
      warmup can be done in two modes.
      'linear' mode gradually increases lr with each step in equal increments
      'constant' mode keeps lr at warmup_begin_lr for warmup_steps
code: def __call__(self, num_update):
      if num_update < self.warmup_steps:
          return self.get_warmup_lr(num_update)
  
      # NOTE: use while rather than if  (for continuing training via load_epoch)
      while self.cur_step_ind <= len(self.step) - 1:
          if num_update > self.step[self.cur_step_ind]:
              self.count = self.step[self.cur_step_ind]
              self.cur_step_ind += 1
              self.base_lr *= self.factor
              logging.info(
                  "Update[%d]: Change learning rate to %0.5e",
                  num_update,
                  self.base_lr,
              )
          else:
              return self.base_lr
      return self.base_lr
  
imports: import logging
  from math import cos, pi
label_desc: Use image node_id 2 for calling the MultiFactorScheduler obj's underlying member method code with example usage: obj.__call__(num_update) and returns: self, self, self