class_docstr: The L_0 distance metric is non-differentiable and therefore is ill-suited for standard gradient descent.
  Instead, we use an iterative algorithm that, in each iteration, identifies some features that don’t have much effect
  on the classifier output and then fixes those features, so their value will never be changed.
  The set of fixed features grows in each iteration until we have, by process of elimination, identified a minimal
  (but possibly not minimum) subset of features that can be modified to generate an adversarial example.
  In each iteration, we use our L_2 attack to identify which features are unimportant [Carlini and Wagner, 2016].
  
  | Paper link: https://arxiv.org/abs/1608.04644
code: def _check_params(self):
      if (
          not isinstance(self.binary_search_steps, int)
          or self.binary_search_steps < 0
      ):
          raise ValueError(
              "The number of binary search steps must be a non-negative integer."
          )
  
imports: from __future__ import absolute_import, division, print_function, unicode_literals
  import logging
  from typing import Optional, Tuple, TYPE_CHECKING
  import numpy
  from tqdm.auto import trange
  from art.config import ART_NUMPY_DTYPE
  from art.optimizers import Adam
  from art.estimators.estimator import BaseEstimator
  from art.estimators.classification.classifier import ClassGradientsMixin
  from art.attacks.attack import EvasionAttack
  from art.utils import compute_success, get_labels_np_array, tanh_to_original, original_to_tanh
  from art.utils import check_and_transform_label_format
label_desc: Use image node_id 3 for calling the CarliniL0Method obj's underlying member method code with example usage: obj._check_params() without return types