class_docstr: Tests that dispatching utilities correctly select generation strategies.
code: def test_num_trials(self) -> None:
      ss = get_discrete_search_space()
      with self.subTest(
          "with budget that is lower than exhaustive, BayesOpt is used"
      ):
          sobol_gpei = choose_generation_strategy(
              search_space=ss, num_trials=23
          )
          self.assertEqual(sobol_gpei._steps[0].model, Models.SOBOL)
          self.assertEqual(sobol_gpei._steps[1].model, Models.BO_MIXED)
      with self.subTest(
          "with budget that is exhaustive, Sobol is used"
      ):
          sobol = choose_generation_strategy(
              search_space=ss, num_trials=36
          )
          self.assertEqual(sobol._steps[0].model, Models.SOBOL)
          self.assertEqual(len(sobol._steps), 1)
      with self.subTest(
          "with budget that is exhaustive and use_saasbo, it warns"
      ):
          with self.assertLogs(
              choose_generation_strategy.__module__, logging.WARNING
          ) as logger:
              sobol = choose_generation_strategy(
                  search_space=ss,
                  num_trials=36,
                  use_saasbo=True,
              )
              self.assertTrue(
                  any(
                      "SAASBO is incompatible with Sobol" in output
                      for output in logger.output
                  ),
                  logger.output,
              )
          self.assertEqual(sobol._steps[0].model, Models.SOBOL)
          self.assertEqual(len(sobol._steps), 1)
  
imports: import logging
  import warnings
  from typing import Any, Dict
  import torch
  from ax.core.objective import MultiObjective
  from ax.core.optimization_config import MultiObjectiveOptimizationConfig
  from ax.modelbridge.dispatch_utils import _make_botorch_step, calculate_num_initialization_trials, choose_generation_strategy, DEFAULT_BAYESIAN_PARALLELISM
  from ax.modelbridge.factory import Cont_X_trans, Y_trans
  from ax.modelbridge.registry import Mixed_transforms, Models
  from ax.modelbridge.transforms.log_y import LogY
  from ax.modelbridge.transforms.winsorize import Winsorize
  from ax.models.winsorization_config import WinsorizationConfig
  from ax.utils.common.testutils import TestCase
  from ax.utils.common.typeutils import not_none
  from ax.utils.testing.core_stubs import get_branin_search_space, get_discrete_search_space, get_experiment, get_factorial_search_space, get_large_factorial_search_space, get_large_ordinal_search_space, get_search_space_with_choice_parameters, run_branin_experiment_with_generation_strategy
  from ax.utils.testing.mock import fast_botorch_optimize
label_desc: Use image node_id 10 for calling the TestDispatchUtils obj's underlying member method code with example usage: obj.test_num_trials() without return types