code: def _apply_gradients(self, grads, x, optim_state):
      
      new_x = [None] * len(x)
      new_optim_state = {
          "t": optim_state["t"] + 1.,
          "m": [None] * len(x),
          "u": [None] * len(x)
      }
      t = new_optim_state["t"]
      for i in xrange(len(x)):
        g = grads[i]
        m_old = optim_state["m"][i]
        u_old = optim_state["u"][i]
        new_optim_state["m"][i] = (
            self._beta1 * m_old + (1. - self._beta1) * g)
        new_optim_state["u"][i] = (
            self._beta2 * u_old + (1. - self._beta2) * g * g)
        m_hat = new_optim_state["m"][i] / (1. - tf.pow(self._beta1, t))
        u_hat = new_optim_state["u"][i] / (1. - tf.pow(self._beta2, t))
        new_x[i] = (
            x[i] - self._lr * m_hat / (tf.sqrt(u_hat) + self._epsilon))
      return new_x, new_optim_state
docs: Refer to parent class documentation.