code: def test_matrix_and_mvn_to_gaussian(
      sample_shape, batch_shape, x_dim, y_dim
  ):
      matrix = torch.randn(batch_shape + (x_dim, y_dim))
      y_mvn = random_mvn(batch_shape, y_dim)
      xy_mvn = random_mvn(batch_shape, x_dim + y_dim)
      gaussian = matrix_and_mvn_to_gaussian(
          matrix, y_mvn
      ) + mvn_to_gaussian(xy_mvn)
      xy = torch.randn(
          sample_shape + (1,) * len(batch_shape) + (x_dim + y_dim,)
      )
      x, y = xy[..., :x_dim], xy[..., x_dim:]
      y_pred = x.unsqueeze(-2).matmul(matrix).squeeze(-2)
      actual_log_prob = gaussian.log_density(xy)
      expected_log_prob = xy_mvn.log_prob(xy) + y_mvn.log_prob(
          y - y_pred
      )
      assert_close(actual_log_prob, expected_log_prob)
  
imports: import math
  from collections import OrderedDict
  import pytest
  import torch
  from torch.distributions import constraints, transform_to
  from torch.nn.functional import pad
  import pyro.distributions
  from pyro.distributions.util import broadcast_shape
  from pyro.ops.gaussian import AffineNormal, Gaussian, gaussian_tensordot, matrix_and_gaussian_to_gaussian, matrix_and_mvn_to_gaussian, mvn_to_gaussian, sequential_gaussian_filter_sample, sequential_gaussian_tensordot
  from tests.common import assert_close
  from tests.ops.gaussian import assert_close_gaussian, random_gaussian, random_mvn
label_desc: Use image node_id 15 for calling a global function with example usage: test_matrix_and_mvn_to_gaussian(sample_shape, batch_shape, x_dim, y_dim) without return types