code: def _filter_infeasible(
      X: Tensor,
      inequality_constraints: List[Tuple[Tensor, Tensor, float]],
  ):
      """Remove all points from `X` that don't satisfy the constraints."""
      is_feasible = torch.ones(
          X.shape[0], dtype=torch.bool, device=X.device
      )
      for inds, weights, bound in inequality_constraints:
          is_feasible &= (X[..., inds] * weights).sum(dim=-1) >= bound
      return X[is_feasible]
  
imports: from __future__ import annotations
  import dataclasses
  import warnings
  from typing import Any, Callable, Dict, List, Optional, Tuple, Union
  import torch
  from botorch.acquisition.acquisition import AcquisitionFunction, OneShotAcquisitionFunction
  from botorch.acquisition.knowledge_gradient import qKnowledgeGradient
  from botorch.acquisition.multi_objective.hypervolume_knowledge_gradient import qHypervolumeKnowledgeGradient
  from botorch.exceptions import InputDataError, UnsupportedError
  from botorch.exceptions.warnings import OptimizationWarning
  from botorch.generation.gen import gen_candidates_scipy, TGenCandidates
  from botorch.logging import logger
  from botorch.optim.initializers import gen_batch_initial_conditions, gen_one_shot_hvkg_initial_conditions, gen_one_shot_kg_initial_conditions, TGenInitialConditions
  from botorch.optim.stopping import ExpMAStoppingCriterion
  from botorch.optim.utils import _filter_kwargs
  from torch import Tensor
label_desc: Use image node_id 14 for calling a global function with example usage: _filter_infeasible(X, inequality_constraints) and returns: X