class_docstr: Implementation of Clean-Label Backdoor Attack introduced in Turner et al., 2018.
  
  Applies a number of backdoor perturbation functions and does not change labels.
  
  | Paper link: https://people.csail.mit.edu/madry/lab/cleanlabel.pdf
code: def _check_params(self) -> None:
      if not isinstance(self.backdoor, PoisoningAttackBackdoor):
          raise ValueError(
              "Backdoor must be of type PoisoningAttackBackdoor"
          )
      if not isinstance(self.attack, ProjectedGradientDescent):
          raise ValueError("There was an issue creating the PGD attack")
      if not 0 < self.pp_poison < 1:
          raise ValueError("pp_poison must be between 0 and 1")
  
file_path: adversarial-robustness-toolbox/art/attacks/poisoning/clean_label_backdoor_attack.py
imports: from __future__ import absolute_import, division, print_function, unicode_literals
  import logging
  from typing import Optional, Tuple, TYPE_CHECKING, Union
  import numpy
  from art.attacks.attack import PoisoningAttackBlackBox
  from art.attacks.evasion.projected_gradient_descent.projected_gradient_descent import ProjectedGradientDescent
  from art.attacks.poisoning.backdoor_attack import PoisoningAttackBackdoor
label_desc: Use image node_id 3 for calling the PoisoningAttackCleanLabelBackdoor obj's underlying member method code with example usage: obj._check_params() without return types