docstr: Generate a child parameter from the given parent population by NSGA-II algorithm.
  Args:
      study:
          Target study object.
      search_space:
          A dictionary containing the parameter names and parameter's distributions.
      parent_population:
          A list of trials that are selected as parent population.
  Returns:
      A dictionary containing the parameter names and parameter's values.
docstr_tok: ["Generate","a","child","parameter","from","the","given","parent","population","by","NSGA-II","algorithm",".","Args",":","study",":","Target","study","object",".","search_space",":","A","dictionary","containing","the","parameter","names","and","parameter","'s","distributions",".","parent_population",":","A","list","of","trials","that","are","selected","as","parent","population",".","Returns",":","A","dictionary","containing","the","parameter","names","and","parameter","'s","values","."]
code: def __call__(
      self,
      study: Study,
      search_space: dict[str, BaseDistribution],
      parent_population: list[FrozenTrial],
  ) -> dict[str, Any]:
      """Generate a child parameter from the given parent population by NSGA-II algorithm.
      Args:
          study:
              Target study object.
          search_space:
              A dictionary containing the parameter names and parameter's distributions.
          parent_population:
              A list of trials that are selected as parent population.
      Returns:
          A dictionary containing the parameter names and parameter's values.
      """
      dominates = (
          _dominates
          if self._constraints_func is None
          else _constrained_dominates
      )
      # We choose a child based on the specified crossover method.
      if self._rng.rng.rand() < self._crossover_prob:
          child_params = perform_crossover(
              self._crossover,
              study,
              parent_population,
              search_space,
              self._rng.rng,
              self._swapping_prob,
              dominates,
          )
      else:
          parent_population_size = len(parent_population)
          parent_params = parent_population[
              self._rng.rng.choice(parent_population_size)
          ].params
          child_params = {
              name: parent_params[name] for name in search_space.keys()
          }
  
      n_params = len(child_params)
      if self._mutation_prob is None:
          mutation_prob = 1.0 / max(1.0, n_params)
      else:
          mutation_prob = self._mutation_prob
  
      params = {}
      for param_name in child_params.keys():
          if self._rng.rng.rand() >= mutation_prob:
              params[param_name] = child_params[param_name]
      return params
  
file_path: optuna/optuna/samplers/nsgaii/_child_generation_strategy.py
imports: from __future__ import annotations
  from collections.abc import Callable
  from collections.abc import Sequence
  from typing import Any
  from optuna.distributions import BaseDistribution
  from optuna.samplers._lazy_random_state import LazyRandomState
  from optuna.samplers.nsgaii._crossover import perform_crossover
  from optuna.samplers.nsgaii._crossovers._base import BaseCrossover
  from optuna.samplers.nsgaii._dominates import _constrained_dominates
  from optuna.study import Study
  from optuna.study._multi_objective import _dominates
  from optuna.trial import FrozenTrial
label_desc: Use image node_id 2 for calling the NSGAIIChildGenerationStrategy obj's underlying member method code with example usage: obj.__call__(study, search_space, parent_population) and returns: params