class_docstr: Blockwise distribution.
  
  This distribution converts a distribution or list of distributions into a
  vector-variate distribution by doing a sequence of reshapes and concatenating
  the results. This is particularly useful for converting `JointDistribution`
  instances to vector-variate for downstream uses which can only handle
  single-`Tensor` distributions.
  
  #### Examples
  
  Flattening a sequence of distrbutions:
  
  ```python
  tfd = tfp.distributions
  
  d = tfd.Blockwise(
      [
          tfd.Independent(
              tfd.Normal(
                  loc=tf.zeros(4, dtype=tf.float64),
                  scale=1),
              reinterpreted_batch_ndims=1),
          tfd.MultivariateNormalTriL(
              scale_tril=tf.eye(2, dtype=tf.float32)),
      ],
      dtype_override=tf.float32,
  )
  x = d.sample([2, 1])
  y = d.log_prob(x)
  x.shape  # ==> (2, 1, 4 + 2)
  x.dtype  # ==> tf.float32
  y.shape  # ==> (2, 1)
  y.dtype  # ==> tf.float32
  
  d.mean()  # ==> np.zeros((4 + 2,))
  ```
  
  Flattening a joint distribution:
  
  ```python
  tfd = tfp.distributions
  
  Root = tfd.JointDistributionCoroutine.Root  # Convenient alias.
  def model():
    e = yield Root(tfd.Independent(tfd.Exponential(rate=[100, 120]), 1))
    g = yield tfd.Gamma(concentration=e[..., 0], rate=e[..., 1])
    n = yield Root(tfd.Normal(loc=0, scale=2.))
    yield tfd.Normal(loc=n, scale=g)
  
  joint = tfd.JointDistributionCoroutine(model)
  d = tfd.Blockwise(joint)
  
  x = d.sample([2, 1])
  y = d.log_prob(x)
  x.shape  # ==> (2, 1, 2 + 1 + 1 + 1)
  x.dtype  # ==> tf.float32
  y.shape  # ==> (2, 1)
  y.dtype  # ==> tf.float32
  ```
class_docstr_tok: ["Blockwise","distribution",".","This","distribution","converts","a","distribution","or","list","of","distributions","into","a","vector-variate","distribution","by","doing","a","sequence","of","reshapes","and","concatenating","the","results",".","This","is","particularly","useful","for","converting","`","JointDistribution","`","instances","to","vector-variate","for","downstream","uses","which","can","only","handle","single-","`","Tensor","`","distributions",".","#","#","#","#","Examples","Flattening","a","sequence","of","distrbutions",":","``","`","python","tfd","=","tfp.distributions","d","=","tfd.Blockwise","(","[","tfd.Independent","(","tfd.Normal","(","loc=tf.zeros","(","4",",","dtype=tf.float64",")",",","scale=1",")",",","reinterpreted_batch_ndims=1",")",",","tfd.MultivariateNormalTriL","(","scale_tril=tf.eye","(","2",",","dtype=tf.float32",")",")",",","]",",","dtype_override=tf.float32",",",")","x","=","d.sample","(","[","2",",","1","]",")","y","=","d.log_prob","(","x",")","x.shape","#","==",">","(","2",",","1",",","4","+","2",")","x.dtype","#","==",">","tf.float32","y.shape","#","==",">","(","2",",","1",")","y.dtype","#","==",">","tf.float32","d.mean","(",")","#","==",">","np.zeros","(","(","4","+","2",",",")",")","``","`","Flattening","a","joint","distribution",":","``","`","python","tfd","=","tfp.distributions","Root","=","tfd.JointDistributionCoroutine.Root","#","Convenient","alias",".","def","model","(",")",":","e","=","yield","Root","(","tfd.Independent","(","tfd.Exponential","(","rate=","[","100",",","120","]",")",",","1",")",")","g","=","yield","tfd.Gamma","(","concentration=e","[","...",",","0","]",",","rate=e","[","...",",","1","]",")","n","=","yield","Root","(","tfd.Normal","(","loc=0",",","scale=2",".",")",")","yield","tfd.Normal","(","loc=n",",","scale=g",")","joint","=","tfd.JointDistributionCoroutine","(","model",")","d","=","tfd.Blockwise","(","joint",")","x","=","d.sample","(","[","2",",","1","]",")","y","=","d.log_prob","(","x",")","x.shape","#","==",">","(","2",",","1",",","2","+","1","+","1","+","1",")","x.dtype","#","==",">","tf.float32","y.shape","#","==",">","(","2",",","1",")","y.dtype","#","==",">","tf.float32","``","`"]
code: def _prob(self, x):
      return self._distribution.prob(self._split_and_reshape_event(x))
  
imports: import functools
  import tensorflow.compat.v2
  from tensorflow_probability.python.distributions import distribution
  from tensorflow_probability.python.distributions import joint_distribution_sequential
  from tensorflow_probability.python.distributions import kullback_leibler
  from tensorflow_probability.python.internal import assert_util
  from tensorflow_probability.python.internal import auto_composite_tensor
  from tensorflow_probability.python.internal import dtype_util
  from tensorflow_probability.python.internal import parameter_properties
  from tensorflow_probability.python.internal import prefer_static
  from tensorflow_probability.python.internal import reparameterization
  from tensorflow_probability.python.internal import tensorshape_util
label_desc: Use image node_id 15 for calling the _Blockwise obj's underlying member method code with example usage: obj._prob(x) and returns: self