code: def test_model_with_dynamic_batch_ndims(self):
      if tf.executing_eagerly():
          self.skipTest("Dynamic shape.")
  
      def coroutine_model():
          g = yield lognormal.LogNormal(0.0, [1.0, 2.0])
          df = yield exponential.Exponential([1.0, 2.0])
          loc = yield sample_lib.Sample(normal.Normal(0, g), 20)
          yield student_t.StudentT(tf.expand_dims(df, -1), loc, 1)
  
      joint = jdab.JointDistributionCoroutineAutoBatched(
          coroutine_model,
          batch_ndims=tf1.placeholder_with_default(1, shape=[]),
          validate_args=True,
      )
  
      batch_shape_tensor = self.evaluate(joint.batch_shape_tensor())
      self.assertAllEqual(batch_shape_tensor, [2])
      event_shape_tensor = self.evaluate(joint.event_shape_tensor())
      self.assertAllEqual(event_shape_tensor[0], [])
      self.assertAllEqual(event_shape_tensor[1], [])
      self.assertAllEqual(event_shape_tensor[2], [20])
      self.assertAllEqual(event_shape_tensor[3], [20])
  
      self.assertAllEqual(joint.batch_shape, tf.TensorShape(None))
      self.assertAllEqual(
          joint._model_flatten(joint.event_shape),
          [tf.TensorShape(None)] * 4,
      )
  
      x = joint.sample(
          [5], seed=test_util.test_seed(sampler_type="stateless")
      )
      lp = self.evaluate(joint.log_prob(x))
      self.assertAllEqual(lp.shape, [5, 2])
  
imports: import collections
  import os
  from absl.testing import parameterized
  import numpy
  import tensorflow.compat.v1
  import tensorflow.compat.v2
  from tensorflow_probability.python.bijectors import bijector_test_util
  from tensorflow_probability.python.bijectors import exp
  from tensorflow_probability.python.bijectors import softplus
  from tensorflow_probability.python.distributions import bernoulli
  from tensorflow_probability.python.distributions import deterministic
  from tensorflow_probability.python.distributions import dirichlet
  from tensorflow_probability.python.distributions import exponential
  from tensorflow_probability.python.distributions import half_normal
  from tensorflow_probability.python.distributions import inverse_gamma
  from tensorflow_probability.python.distributions import joint_distribution_auto_batched
  from tensorflow_probability.python.distributions import joint_distribution_coroutine
  from tensorflow_probability.python.distributions import joint_distribution_named
  from tensorflow_probability.python.distributions import joint_distribution_sequential
  from tensorflow_probability.python.distributions import lognormal
  from tensorflow_probability.python.distributions import multinomial
  from tensorflow_probability.python.distributions import normal
  from tensorflow_probability.python.distributions import poisson
  from tensorflow_probability.python.distributions import sample
  from tensorflow_probability.python.distributions import student_t
  from tensorflow_probability.python.distributions import transformed_distribution
  from tensorflow_probability.python.distributions import uniform
  from tensorflow_probability.python.internal import test_util
  from tensorflow_probability.python.util import deferred_tensor
label_desc: Use image node_id 3 for calling the JointDistributionAutoBatchedTest obj's underlying member method code with example usage: obj.test_model_with_dynamic_batch_ndims() without return types