code: def test_gamma_gaussian_hmm_shape(
      scale_shape,
      init_shape,
      trans_mat_shape,
      trans_mvn_shape,
      obs_mat_shape,
      obs_mvn_shape,
      hidden_dim,
      obs_dim,
  ):
      init_dist = random_mvn(init_shape, hidden_dim)
      trans_mat = torch.randn(
          trans_mat_shape + (hidden_dim, hidden_dim)
      )
      trans_dist = random_mvn(trans_mvn_shape, hidden_dim)
      obs_mat = torch.randn(obs_mat_shape + (hidden_dim, obs_dim))
      obs_dist = random_mvn(obs_mvn_shape, obs_dim)
      scale_dist = random_gamma(scale_shape)
      d = dist.GammaGaussianHMM(
          scale_dist,
          init_dist,
          trans_mat,
          trans_dist,
          obs_mat,
          obs_dist,
      )
  
      shape = broadcast_shape(
          scale_shape + (1,),
          init_shape + (1,),
          trans_mat_shape,
          trans_mvn_shape,
          obs_mat_shape,
          obs_mvn_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()
      assert data.shape == d.shape()
      actual = d.log_prob(data)
      assert actual.shape == expected_batch_shape
      check_expand(d, data)
  
      mixing, final = d.filter(data)
      assert isinstance(mixing, dist.Gamma)
      assert mixing.batch_shape == d.batch_shape
      assert mixing.event_shape == ()
      assert isinstance(final, dist.MultivariateNormal)
      assert final.batch_shape == d.batch_shape
      assert final.event_shape == (hidden_dim,)
  
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 17 for calling a global function with example usage: test_gamma_gaussian_hmm_shape(scale_shape, init_shape, trans_mat_shape, trans_mvn_shape, obs_mat_shape, obs_mvn_shape, hidden_dim, obs_dim) without return types