code: def test_get_outcome_constraint_transforms(self):
      # test None
      self.assertIsNone(get_outcome_constraint_transforms(None))
  
      # test basic evaluation
      for dtype in (torch.float, torch.double):
          tkwargs = {"dtype": dtype, "device": self.device}
          A = self.A.to(**tkwargs)
          b = self.b.to(**tkwargs)
          Ys = self.Ys.to(**tkwargs)
          results = self.results.to(**tkwargs)
          ocs = get_outcome_constraint_transforms((A, b))
          self.assertEqual(len(ocs), 2)
          for i in (0, 1):
              for j in (0, 1):
                  self.assertTrue(
                      torch.equal(ocs[j](Ys[:, i]), results[:, i, j])
                  )
  
          # test broadcasted evaluation
          k, t = 3, 4
          mc_samples, b, q = 6, 4, 5
          A_ = torch.randn(k, t, **tkwargs)
          b_ = torch.randn(k, 1, **tkwargs)
          Y = torch.randn(mc_samples, b, q, t, **tkwargs)
          ocs = get_outcome_constraint_transforms((A_, b_))
          self.assertEqual(len(ocs), k)
          self.assertEqual(
              ocs[0](Y).shape, torch.Size([mc_samples, b, q])
          )
  
file_path: botorch/test/utils/test_constraints.py
imports: import torch
  from botorch.utils import get_outcome_constraint_transforms
  from botorch.utils.constraints import get_monotonicity_constraints
  from botorch.utils.testing import BotorchTestCase
label_desc: Use image node_id 2 for calling the TestConstraintUtils obj's underlying member method code with example usage: obj.test_get_outcome_constraint_transforms() without return types