code: def test_deduplication(self) -> None:
      tiny_parameters = [
          FixedParameter(
              name="x1",
              parameter_type=ParameterType.FLOAT,
              value=1.0,
          ),
          ChoiceParameter(
              name="x2",
              parameter_type=ParameterType.FLOAT,
              values=[float(x) for x in range(2)],
          ),
      ]
      tiny_search_space = SearchSpace(
          parameters=cast(List[Parameter], tiny_parameters)
      )
      exp = get_branin_experiment(search_space=tiny_search_space)
      sobol = GenerationStrategy(
          name="Sobol",
          steps=[
              GenerationStep(
                  model=Models.SOBOL,
                  num_trials=-1,
                  # Disable model-level deduplication.
                  model_kwargs={"deduplicate": False},
                  should_deduplicate=True,
              ),
          ],
      )
      for _ in range(2):
          g = sobol.gen(exp)
          exp.new_trial(generator_run=g).run()
  
      self.assertEqual(len(exp.arms_by_signature), 2)
  
      with self.assertRaisesRegex(
          GenerationStrategyRepeatedPoints, "exceeded `MAX_GEN_DRAWS`"
      ), mock.patch(
          "ax.modelbridge.generation_node.logger.info"
      ) as mock_logger:
          g = sobol.gen(exp)
      self.assertEqual(mock_logger.call_count, 5)
      self.assertIn(
          "The generator run produced duplicate arms.",
          mock_logger.call_args[0][0],
      )
  
imports: import logging
  from typing import cast, List
  from unittest import mock
  from unittest.mock import MagicMock, patch
  from ax.core.arm import Arm
  from ax.core.base_trial import TrialStatus
  from ax.core.experiment import Experiment
  from ax.core.generator_run import GeneratorRun
  from ax.core.observation import ObservationFeatures
  from ax.core.parameter import ChoiceParameter, FixedParameter, Parameter, ParameterType
  from ax.core.search_space import SearchSpace
  from ax.core.utils import get_pending_observation_features_based_on_trial_status
  from ax.exceptions.core import DataRequiredError, UnsupportedError, UserInputError
  from ax.exceptions.generation_strategy import GenerationStrategyCompleted, GenerationStrategyMisconfiguredException, GenerationStrategyRepeatedPoints, MaxParallelismReachedException
  from ax.modelbridge.discrete import DiscreteModelBridge
  from ax.modelbridge.factory import get_sobol
  from ax.modelbridge.generation_node import GenerationNode
  from ax.modelbridge.generation_strategy import GenerationStep, GenerationStrategy
  from ax.modelbridge.model_spec import ModelSpec
  from ax.modelbridge.random import RandomModelBridge
  from ax.modelbridge.registry import Cont_X_trans, MODEL_KEY_TO_MODEL_SETUP, Models
  from ax.modelbridge.torch import TorchModelBridge
  from ax.modelbridge.transition_criterion import MaxGenerationParallelism, MaxTrials, MinTrials
  from ax.models.random.sobol import SobolGenerator
  from ax.utils.common.equality import same_elements
  from ax.utils.common.mock import mock_patch_method_original
  from ax.utils.common.testutils import TestCase
  from ax.utils.common.typeutils import not_none
  from ax.utils.testing.core_stubs import get_branin_data, get_branin_experiment, get_choice_parameter, get_data, get_experiment_with_multi_objective, get_hierarchical_search_space_experiment
label_desc: Use image node_id 22 for calling the TestGenerationStrategy obj's underlying member method code with example usage: obj.test_deduplication() without return types