def __repr__(self) -> str:
        """
        This method returns a summary of the best performing (lowest perturbation in the parallel case) attacks
        per image passed to the AutoAttack class.
        """
        if self.parallel_pool_size > 0:
            best_attack_meta = "\n".join(
                [
                    f"image {i+1}: {str(self.args[idx][3])}" if idx != 0 else f"image {i+1}: n/a"
                    for i, idx in enumerate(self.best_attacks)
                ]
            )
            auto_attack_meta = (
                f"AutoAttack(targeted={self.targeted}, parallel_pool_size={self.parallel_pool_size}, "
                + f"num_attacks={len(self.args)})"
            )
            return f"{auto_attack_meta}\nBestAttacks:\n{best_attack_meta}"

        best_attack_meta = "\n".join(
            [
                f"image {i+1}: {str(self.attacks[idx])}" if idx != -2 else f"image {i+1}: n/a"
                for i, idx in enumerate(self.best_attacks)
            ]
        )
        auto_attack_meta = (
            f"AutoAttack(targeted={self.targeted}, parallel_pool_size={self.parallel_pool_size}, "
            + f"num_attacks={len(self.attacks)})"
        )
        return f"{auto_attack_meta}\nBestAttacks:\n{best_attack_meta}"

        This method returns a summary of the best performing (lowest perturbation in the parallel case) attacks
        per image passed to the AutoAttack class.
        
art/attacks/evasion/auto_attack.py