code: def assertDictEqualRecursive(self, actual, expected):
      self.assertEqual(type(actual), type(expected))
      if isinstance(actual, dict):
          self.assertSameElements(actual.keys(), expected.keys())
          for key, _ in expected.items():
              self.assertDictEqualRecursive(actual[key], expected[key])
      elif isinstance(actual, jnp.ndarray):
          self.assertTrue(jnp.array_equal(actual, expected))
      elif isinstance(actual, np.ndarray):
          self.assertTrue(np.allclose(actual, expected))
      else:
          self.assertEqual(actual, expected)
  
imports: from absl.testing import parameterized
  import jax.numpy
  import ml_collections
  import numpy
  from scenic.projects.mtv import model_utils
  import tensorflow
label_desc: Use image node_id 2 for calling the ModelUtilsTest obj's underlying member method code with example usage: obj.assertDictEqualRecursive(actual, expected) without return types