class_docstr: Reduce the learning rate by a factor for every *n* steps.
  
  It returns a new learning rate by::
  
      base_lr * pow(factor, floor(num_update/step))
  
  Parameters
  ----------
  step : int
      Changes the learning rate for every n updates.
  factor : float, optional
      The factor to change the learning rate.
  stop_factor_lr : float, optional
      Stop updating the learning rate if it is less than this value.
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 num_update > self.count + self.step:
          self.count += self.step
          self.base_lr *= self.factor
          if self.base_lr < self.stop_factor_lr:
              self.base_lr = self.stop_factor_lr
              logging.info(
                  "Update[%d]: now learning rate arrived at %0.5e, will not "
                  "change in the future",
                  num_update,
                  self.base_lr,
              )
          else:
              logging.info(
                  "Update[%d]: Change learning rate to %0.5e",
                  num_update,
                  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 FactorScheduler obj's underlying member method code with example usage: obj.__call__(num_update) and returns: self, self