class_docstr: Parameter scaling for GenAttack.  Decrease mutation rate and range when
  search is detected to be stuck.
  
  For more details, see section 4.1.2 of https://arxiv.org/abs/1805.11090.
code: def update(self, elite_val):
      stalled = abs(elite_val - self.best_val) <= self.crit
      self.num_i = torch.where(stalled, self.num_i + 1, self.zeros)
      new_plateau = (self.num_i % 100 == 0) & (self.num_i != 0)
      self.num_plateaus = torch.where(
          new_plateau, self.num_plateaus + 1, self.num_plateaus
      )
  
      # update alpha and rho
      self.rho = torch.maximum(
          self.rho_min, self.rho_init * self.decay**self.num_plateaus
      )
      self.alpha = torch.maximum(
          self.alpha_min,
          self.alpha_init * self.decay**self.num_plateaus,
      )
  
      self.best_val = torch.maximum(elite_val, self.best_val)
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  from __future__ import unicode_literals
  from typing import Optional
  from math import inf
  import torch
  import torch.nn.functional
  from advertorch.attacks.base import Attack
  from advertorch.attacks.base import LabelMixin
  from .utils import _check_param, _flatten, _make_projector
label_desc: Use image node_id 2 for calling the GenAttackScheduler obj's underlying member method code with example usage: obj.update(elite_val) without return types