code: def testConvGeneralDilated(
      self,
      lhs_shape,
      rhs_shape,
      strides,
      padding,
      lhs_dilation,
      rhs_dilation,
      feature_group_count,
      batch_group_count,
      dimension_numbers,
      perms,
  ):
      lhs_perm, rhs_perm = perms  # permute to compatible shapes
  
      lhs = np.transpose(np.ones(lhs_shape), lhs_perm)
      rhs = np.transpose(np.ones(rhs_shape), rhs_perm)
  
      jax_conv = lax.conv_general_dilated(
          lhs,
          rhs,
          strides,
          padding,
          lhs_dilation,
          rhs_dilation,
          dimension_numbers,
          feature_group_count,
          batch_group_count,
      )
  
      tf_conv = extensions.tf_conv_general_dilated(
          lhs,
          rhs,
          strides,
          padding,
          None,
          lhs_dilation,
          rhs_dilation,
          dimension_numbers,
          feature_group_count,
          batch_group_count,
      )
  
      self.assertAllClose(tf_conv, tf_np.asarray(jax_conv))
  
imports: import functools
  import itertools
  from absl import flags
  from absl.testing import parameterized
  from jax import lax
  import numpy
  import tensorflow.compat.v2
  from trax.tf_numpy import extensions
  import trax.tf_numpy.numpy
label_desc: Use image node_id 17 for calling the ExtensionsTest obj's underlying member method code with example usage: obj.testConvGeneralDilated(lhs_shape, rhs_shape, strides, padding, lhs_dilation, rhs_dilation, feature_group_count, batch_group_count, dimension_numbers, perms) without return types