code: def __call__(self, gradient: ep.Tensor) -> ep.Tensor:
      self.t += 1
  
      self.m = self.beta1 * self.m + (1 - self.beta1) * gradient
      self.v = self.beta2 * self.v + (1 - self.beta2) * gradient**2
  
      bias_correction_1 = 1 - self.beta1**self.t
      bias_correction_2 = 1 - self.beta2**self.t
  
      m_hat = self.m / bias_correction_1
      v_hat = self.v / bias_correction_2
  
      return self.stepsize * m_hat / (ep.sqrt(v_hat) + self.epsilon)
  
imports: from typing import Union, Any, Optional, Callable, Tuple
  from abc import ABC, abstractmethod
  import eagerpy
  from ..devutils import flatten
  from ..devutils import atleast_kd
  from ..types import Bounds
  from ..models.base import Model
  from ..criteria import Misclassification, TargetedMisclassification
  from ..distances import l1, l2, linf
  from .base import FixedEpsilonAttack
  from .base import T
  from .base import get_criterion
  from .base import raise_if_kwargs
  from .base import verify_input_bounds
label_desc: Use image node_id 2 for calling the AdamOptimizer obj's underlying member method code with example usage: obj.__call__(gradient) and returns: unknown