code: def test_gaussian_mrf_shape(
      init_shape, trans_shape, obs_shape, hidden_dim, obs_dim
  ):
      init_dist = random_mvn(init_shape, hidden_dim)
      trans_dist = random_mvn(trans_shape, hidden_dim + hidden_dim)
      obs_dist = random_mvn(obs_shape, hidden_dim + obs_dim)
      d = dist.GaussianMRF(init_dist, trans_dist, obs_dist)
  
      shape = broadcast_shape(init_shape + (1,), trans_shape, obs_shape)
      expected_batch_shape, time_shape = shape[:-1], shape[-1:]
      expected_event_shape = time_shape + (obs_dim,)
      assert d.batch_shape == expected_batch_shape
      assert d.event_shape == expected_event_shape
      assert d.support.event_dim == d.event_dim
  
      data = obs_dist.expand(shape).sample()[..., hidden_dim:]
      assert data.shape == d.shape()
      actual = d.log_prob(data)
      assert actual.shape == expected_batch_shape
      check_expand(d, data)
  
imports: import logging
  import operator
  from functools import reduce
  import opt_einsum
  import pytest
  import torch
  import pyro
  import pyro.distributions
  from pyro.distributions.hmm import _sequential_gamma_gaussian_tensordot, _sequential_logmatmulexp
  from pyro.distributions.util import broadcast_shape
  from pyro.infer import TraceEnum_ELBO, config_enumerate
  from pyro.ops.gamma_gaussian import gamma_and_mvn_to_gamma_gaussian, gamma_gaussian_tensordot, matrix_and_mvn_to_gamma_gaussian
  from pyro.ops.gaussian import gaussian_tensordot, matrix_and_mvn_to_gaussian, mvn_to_gaussian
  from pyro.ops.indexing import Vindex
  from tests.common import assert_close
  from tests.ops.gamma_gaussian import assert_close_gamma_gaussian, random_gamma, random_gamma_gaussian
  from tests.ops.gaussian import random_mvn
label_desc: Use image node_id 14 for calling a global function with example usage: test_gaussian_mrf_shape(init_shape, trans_shape, obs_shape, hidden_dim, obs_dim) without return types