code: def unconstrained_bijectors(
      draw,
      max_forward_event_ndims=None,
      must_preserve_event_ndims=False,
      validate_args=True,
  ):
      """Strategy for drawing forward-unconstrained bijectors.
  
      The bijectors emitted by this are those whose `forward` computation
      can act on all of R^n, with n <= `max_forward_event_ndims`.
  
      Args:
        draw: Strategy sampler supplied by `@hps.composite`.
        max_forward_event_ndims: Optional python `int`, maximum acceptable bijector
          `forward_event_ndims`.
        must_preserve_event_ndims: Optional python `bool`, `True` if the returned
          bijector must preserve the rank of the event.
        validate_args: Python `bool`; whether to enable runtime assertions.
  
      Returns:
        unconstrained: A strategy for drawing such bijectors.
      """
      if max_forward_event_ndims is None:
          max_forward_event_ndims = float("inf")
  
      ndims_by_prefix = dict(SCALAR=0, VECTOR=1, MATRIX=2, OTHER=-1)
  
      def is_acceptable(support):
          """Determines if a `BijectorSupport` object is acceptable."""
          if "UNCONSTRAINED" not in support.forward:
              return False
          forward_prefix = support.forward.split("_")[0]
          if ndims_by_prefix[forward_prefix] > max_forward_event_ndims:
              return False
          if must_preserve_event_ndims:
              inverse_prefix = support.inverse.split("_")[0]
              if (
                  ndims_by_prefix[forward_prefix]
                  != ndims_by_prefix[inverse_prefix]
              ):
                  return False
          return True
  
      supports = bijector_supports()
      bijectors = trivially_instantiable_bijectors()
      acceptable_keys = sorted(
          [
              k
              for k in bijectors
              if k == "Invert" or is_acceptable(supports[k])
          ]
      )
      bijector_name = draw(hps.sampled_from(acceptable_keys))
      if bijector_name == "Invert":
          acceptable_keys = [
              k
              for k in bijectors
              if is_acceptable(supports[k].invert())
          ]
          underlying = draw(hps.sampled_from(acceptable_keys))
          underlying = bijectors[underlying](
              validate_args=validate_args
          )
          return tfb.Invert(underlying, validate_args=validate_args)
      return bijectors[bijector_name](validate_args=validate_args)
  
imports: import collections
  import inspect
  from absl import logging
  import hypothesis.strategies
  import tensorflow.compat.v2
  from tensorflow_probability.python import bijectors
  from tensorflow_probability.python.distributions import lkj
  from tensorflow_probability.python.internal import dtype_util
  from tensorflow_probability.python.internal import hypothesis_testlib
  from tensorflow_probability.python.internal import tensorshape_util
label_desc: Use image node_id 4 for calling a global function with example usage: unconstrained_bijectors(draw, max_forward_event_ndims, must_preserve_event_ndims, validate_args) and returns: bijectors, True, tfb, False, False, False