def __init__(
        self,
        estimator: "CLASSIFIER_TYPE",
        batch_size: int = 64,
        norm: int | float | str = 2,
        sub_dim: int = 10,
        max_iter: int = 4000,
        bin_search_tol: float = 0.1,
        lambda_param: float = 0.6,
        sigma: float = 0.0002,
        verbose: bool = True,
    ) -> None:
        """
        Create a Geometric Decision-based Attack instance.

        :param estimator: A trained classifier.
        :param batch_size: The size of the batch used by the estimator during inference.
        :param norm: The norm of the adversarial perturbation. Possible values: "inf", np.inf, 1 or 2.
        :param sub_dim: Dimensionality of 2D frequency space (DCT).
        :param max_iter: Maximum number of iterations.
        :param bin_search_tol: Maximum remaining L2 perturbation defining binary search convergence. Input images are
                               normalised by maximal estimator.clip_value[1] if available or maximal value in the input
                               image.
        :param lambda_param: The lambda of equation 19 with `lambda_param=0` corresponding to a single iteration and
                             `lambda_param=1` to a uniform distribution of iterations per step.
        :param sigma: Variance of the Gaussian perturbation.
        :param targeted: Should the attack target one specific class.
        :param verbose: Show progress bars.
        """
        super().__init__(estimator=estimator)

        self.batch_size = batch_size
        self.norm = norm
        self.sub_dim = sub_dim
        self.max_iter = max_iter
        self.bin_search_tol = bin_search_tol
        self.lambda_param = lambda_param
        self.sigma = sigma
        self._targeted = False

        self.verbose = verbose
        self._check_params()

        self.sub_basis: np.ndarray
        self.nb_calls = 0
        self.clip_min = 0.0
        self.clip_max = 0.0
        if self.estimator.input_shape is None:  # pragma: no cover
            raise ValueError("The `input_shape` of the is required but None.")
        self.nb_channels = (
            self.estimator.input_shape[0] if self.estimator.channels_first else self.estimator.input_shape[2]
        )

        # Optimal number of iterations
        iteration = round(self.max_iter / 500)
        q_opt_it = int(self.max_iter - iteration * 25)
        _, iterate = self._opt_query_iteration(q_opt_it, iteration, self.lambda_param)
        q_opt_it = int(self.max_iter - iterate * 25)
        self.q_opt_iter, self.iterate = self._opt_query_iteration(q_opt_it, iteration, self.lambda_param)

        Create a Geometric Decision-based Attack instance.

        :param estimator: A trained classifier.
        :param batch_size: The size of the batch used by the estimator during inference.
        :param norm: The norm of the adversarial perturbation. Possible values: "inf", np.inf, 1 or 2.
        :param sub_dim: Dimensionality of 2D frequency space (DCT).
        :param max_iter: Maximum number of iterations.
        :param bin_search_tol: Maximum remaining L2 perturbation defining binary search convergence. Input images are
                               normalised by maximal estimator.clip_value[1] if available or maximal value in the input
                               image.
        :param lambda_param: The lambda of equation 19 with `lambda_param=0` corresponding to a single iteration and
                             `lambda_param=1` to a uniform distribution of iterations per step.
        :param sigma: Variance of the Gaussian perturbation.
        :param targeted: Should the attack target one specific class.
        :param verbose: Show progress bars.
        
art/attacks/evasion/geometric_decision_based_attack.py