def caa_saturation(
        self, data: "torch.Tensor", saturation: "torch.Tensor", labels: "torch.Tensor"
    ) -> tuple["torch.Tensor", "torch.Tensor"]:
        """
        Compute the adversarial examples for saturation component.

        :param data: A tensor of a batch of original inputs to be attacked.
        :param saturation: Specify the saturation factor.
        :param labels: A tensor of a batch of the original labels to be predicted.
        :return: The perturbed data and the corresponding saturation factor.
        """
        saturation = saturation.detach().clone()
        saturation[self.is_attacked] = 1
        saturation.requires_grad_()
        sur_data = data.detach().requires_grad_()

        return self._comp_pgd(
            data=sur_data,
            labels=labels,
            attack_idx=1,
            attack_parameter=saturation,
            ori_is_attacked=self.is_attacked.clone(),
        )

        Compute the adversarial examples for saturation component.

        :param data: A tensor of a batch of original inputs to be attacked.
        :param saturation: Specify the saturation factor.
        :param labels: A tensor of a batch of the original labels to be predicted.
        :return: The perturbed data and the corresponding saturation factor.
        
art/attacks/evasion/composite_adversarial_attack.py