code: def tunable_feature_indices(
      bounds: List[Tuple[float, float]],
      fixed_features: Optional[Dict[int, float]] = None,
  ) -> np.ndarray:
      """Get the feature indices of tunable features.
  
      Args:
          bounds: A list of (lower, upper) tuples for each column of X.
          fixed_features: A map {feature_index: value} for features that
              should be fixed to a particular value during generation.
  
      Returns:
          The indices of tunable features.
      """
      fixed_feature_indices = (
          list(fixed_features.keys()) if fixed_features else []
      )
      feature_indices = np.arange(len(bounds))
      return np.delete(feature_indices, fixed_feature_indices)
  
imports: from __future__ import annotations
  import itertools
  import warnings
  from typing import Callable, Dict, List, Optional, Protocol, Set, Tuple, Union
  import numpy
  import torch
  from ax.core.search_space import SearchSpaceDigest
  from ax.exceptions.core import SearchSpaceExhausted, UnsupportedError
  from ax.models.types import TConfig
  from ax.utils.common.typeutils import checked_cast
  from botorch.acquisition.risk_measures import RiskMeasureMCObjective
  from torch import Tensor
label_desc: Use image node_id 5 for calling a global function with example usage: tunable_feature_indices(bounds, fixed_features) and returns: np