code: def test_normalize_linear_constraints(self):
      tkwargs = {"device": self.device}
      for dtype in (torch.float, torch.double):
          tkwargs["dtype"] = dtype
          constraints = [
              (
                  torch.tensor(
                      [1, 2, 0], dtype=torch.int64, device=self.device
                  ),
                  torch.tensor([1.0, 1.0, 1.0], **tkwargs),
                  1.0,
              )
          ]
          bounds = torch.tensor(
              [[0.1, 0.3, 0.1, 30.0], [0.6, 0.7, 0.7, 700.0]], **tkwargs
          )
          new_constraints = normalize_linear_constraints(
              bounds, constraints
          )
          expected_coefficients = torch.tensor(
              [0.4000, 0.6000, 0.5000], **tkwargs
          )
          self.assertTrue(
              torch.allclose(
                  new_constraints[0][1], expected_coefficients
              )
          )
          expected_rhs = 0.5
          self.assertAlmostEqual(new_constraints[0][-1], expected_rhs)
  
imports: from __future__ import annotations
  import itertools
  import warnings
  from typing import Any, Dict, Type
  from unittest import mock
  import numpy
  import torch
  from botorch.exceptions.errors import BotorchError
  from botorch.models.gp_regression import SingleTaskGP
  from botorch.sampling.pathwise import draw_matheron_paths
  from botorch.utils.sampling import _convert_bounds_to_inequality_constraints, batched_multinomial, DelaunayPolytopeSampler, draw_sobol_samples, find_interior_point, get_polytope_samples, HitAndRunPolytopeSampler, manual_seed, normalize_linear_constraints, optimize_posterior_samples, PolytopeSampler, sample_hypersphere, sample_simplex, sparse_to_dense_constraints
  from botorch.utils.testing import BotorchTestCase
label_desc: Use image node_id 7 for calling the TestSampleUtils obj's underlying member method code with example usage: obj.test_normalize_linear_constraints() without return types