class_docstr: Implementation of the composite adversarial attack on image classifiers in PyTorch. The attack is constructed by
  adversarially perturbing the hue component of the inputs. It uses order scheduling to search for the attack sequence
  and uses the iterative gradient sign method to optimize the perturbations in semantic space and Lp-ball (see
  `FastGradientMethod` and `BasicIterativeMethod`).
  
  | Note that this attack is intended for only PyTorch image classifiers with RGB images in the range [0, 1] as inputs
  
  | Paper link: https://arxiv.org/abs/2202.04235
class_docstr_tok: ["Implementation","of","the","composite","adversarial","attack","on","image","classifiers","in","PyTorch",".","The","attack","is","constructed","by","adversarially","perturbing","the","hue","component","of","the","inputs",".","It","uses","order","scheduling","to","search","for","the","attack","sequence","and","uses","the","iterative","gradient","sign","method","to","optimize","the","perturbations","in","semantic","space","and","Lp-ball","(","see","`","FastGradientMethod","`","and","`","BasicIterativeMethod","`",")",".","|","Note","that","this","attack","is","intended","for","only","PyTorch","image","classifiers","with","RGB","images","in","the","range","[","0",",","1","]","as","inputs","|","Paper","link",":","https",":","\/\/arxiv.org\/abs\/2202.04235"]
docstr: Check validity of parameters.
docstr_tok: ["Check","validity","of","parameters","."]
code: def _check_params(self) -> None:
      """
      Check validity of parameters.
      """
      super()._check_params()
      if not isinstance(self.enabled_attack, tuple) or not all(
          value in [0, 1, 2, 3, 4, 5] for value in self.enabled_attack
      ):
          raise ValueError(
              "The parameter `enabled_attack` must be a tuple specifying the attack to launch. For simplicity, we use"
              + " the following abbreviations to specify each attack types. 0: Hue, 1: Saturation, 2: Rotation,"
              + " 3: Brightness, 4: Contrast, 5: PGD(L-infinity). Therefore, `(0,1,2)` means that the attack combines"
              + " hue, saturation, and rotation; `(0,1,2,3,4)` means the all semantic attacks; `(0,1,2,3,4,5)` means"
              + " the full attacks."
          )
      _epsilons_range = (
          ("hue_epsilon", (-np.pi, np.pi), "(-np.pi, np.pi)"),
          ("sat_epsilon", (0.0, np.inf), "(0.0, np.inf)"),
          ("rot_epsilon", (-360.0, 360.0), "(-360.0, 360.0)"),
          ("bri_epsilon", (-1.0, 1.0), "(-1.0, 1.0)"),
          ("con_epsilon", (0.0, np.inf), "(0.0, np.inf)"),
          ("pgd_epsilon", (-1.0, 1.0), "(-1.0, 1.0)"),
      )
      for i in range(6):
          if (
              not isinstance(self.epsilons[i], tuple)
              or not len(self.epsilons[i]) == 2
              or not (
                  isinstance(self.epsilons[i][0], float)
                  and isinstance(self.epsilons[i][1], float)
              )
          ):
              logger.info(
                  "The argument `%s` must be an interval within %s of type tuple.",
                  _epsilons_range[i][0],
                  _epsilons_range[i][2],
              )
              raise TypeError(
                  f"The argument `{_epsilons_range[i][0]}` must be an interval "
                  f"within {_epsilons_range[i][2]} of type tuple."
              )
  
          if (
              not _epsilons_range[i][1][0]
              <= self.epsilons[i][0]
              <= self.epsilons[i][1]
              <= _epsilons_range[i][1][1]
          ):
              logger.info(
                  "The argument `%s` must be an interval within %s of type tuple.",
                  _epsilons_range[i][0],
                  _epsilons_range[i][2],
              )
              raise ValueError(
                  f"The argument `{_epsilons_range[i][0]}` must be an interval "
                  f"within {_epsilons_range[i][2]} of type tuple."
              )
  
      if not isinstance(self.early_stop, bool):
          logger.info("The flag `early_stop` has to be of type bool.")
          raise TypeError(
              "The flag `early_stop` has to be of type bool."
          )
  
      if not isinstance(self.max_iter, int):
          logger.info(
              "The argument `max_iter` must be positive of type int."
          )
          raise TypeError(
              "The argument `max_iter` must be positive of type int."
          )
  
      if self.max_iter <= 0:
          logger.info(
              "The argument `max_iter` must be positive of type int."
          )
          raise ValueError(
              "The argument `max_iter` must be positive of type int."
          )
  
      if not isinstance(self.max_inner_iter, int):
          logger.info(
              "The argument `max_inner_iter` must be positive of type int."
          )
          raise TypeError(
              "The argument `max_inner_iter` must be positive of type int."
          )
  
      if self.max_inner_iter <= 0:
          logger.info(
              "The argument `max_inner_iter` must be positive of type int."
          )
          raise ValueError(
              "The argument `max_inner_iter` must be positive of type int."
          )
  
      if self.attack_order not in ("fixed", "random", "scheduled"):
          logger.info(
              "The argument `attack_order` should be either `fixed`, `random`, or `scheduled`."
          )
          raise ValueError(
              "The argument `attack_order` should be either `fixed`, `random`, or `scheduled`."
          )
  
      if self.batch_size <= 0:
          logger.info("The batch size has to be positive.")
          raise ValueError("The batch size has to be positive.")
  
      if not isinstance(self.verbose, bool):
          logger.info("The argument `verbose` has to be a Boolean.")
          raise TypeError("The argument `verbose` has to be a Boolean.")
  
imports: from __future__ import absolute_import, division, print_function, unicode_literals
  import logging
  from typing import Optional, Tuple, List, TYPE_CHECKING
  import numpy
  from tqdm.auto import tqdm
  from art.attacks.attack import EvasionAttack
  from art.config import ART_NUMPY_DTYPE
  from art.estimators.estimator import BaseEstimator, LossGradientsMixin
  from art.estimators.classification.classifier import ClassifierMixin
  from art.utils import compute_success, check_and_transform_label_format
label_desc: Use image node_id 2 for calling the CompositeAdversarialAttackPyTorch obj's underlying member method code with example usage: obj._check_params() without return types