class_docstr: Common class for different variations of implementation of the Projected Gradient Descent attack. The attack is an
  iterative method in which, after each iteration, the perturbation is projected on an lp-ball of specified radius (in
  addition to clipping the values of the adversarial sample so that it lies in the permitted data range). This is the
  attack proposed by Madry et al. for adversarial training.
  
  | Paper link: https://arxiv.org/abs/1706.06083
docstr: Check whether random eps is enabled, then scale eps and eps_step appropriately.
docstr_tok: ["Check","whether","random","eps","is","enabled",",","then","scale","eps","and","eps_step","appropriately","."]
code: def _random_eps(self):
      """
      Check whether random eps is enabled, then scale eps and eps_step appropriately.
      """
      if self.random_eps:
          ratio = self.eps_step / self.eps
  
          if isinstance(self.eps, (int, float)):
              self.eps = np.round(self.norm_dist.rvs(1)[0], 10)
          else:
              self.eps = np.round(
                  self.norm_dist.rvs(size=self.eps.shape), 10
              )
  
          self.eps_step = ratio * self.eps
  
imports: from __future__ import absolute_import, division, print_function, unicode_literals
  import logging
  from typing import Optional, Union, TYPE_CHECKING
  import numpy
  from scipy.stats import truncnorm
  from tqdm.auto import trange
  from art.attacks.evasion.fast_gradient import FastGradientMethod
  from art.config import ART_NUMPY_DTYPE
  from art.estimators.classification.classifier import ClassifierMixin
  from art.estimators.estimator import BaseEstimator, LossGradientsMixin
  from art.utils import compute_success, get_labels_np_array, check_and_transform_label_format, compute_success_array
  from art.summary_writer import SummaryWriter
label_desc: Use image node_id 2 for calling the ProjectedGradientDescentCommon obj's underlying member method code with example usage: obj._random_eps() without return types