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):
          np.testing.assert_allclose(actual, expected)
      else:
          self.assertEqual(actual, expected)
  
file_path: scenic/scenic/projects/unloc/model_utils_test.py
imports: from absl.testing import absltest
  from absl.testing import parameterized
  import flax
  from flax import struct
  import jax.numpy
  import ml_collections
  import numpy
  from scenic.projects.unloc import model_utils
  from scenic.train_lib import train_utils
label_desc: Use image node_id 1 for calling the ModelUtilsTest obj's underlying member method code with example usage: obj.assertDictEqualRecursive(actual, expected) without return types