code: def test_forward_x1_eq_x2(self, ard=False, use_keops=True, **kwargs):
      max_cholesky_size = (
          CHOLESKY_SIZE_KEOPS if use_keops else CHOLESKY_SIZE_NONKEOPS
      )
      with gpytorch.settings.max_cholesky_size(max_cholesky_size):
          ndims = 3
          x1 = torch.randn(100, 3)
  
          if ard:
              kern1 = self.k1(ard_num_dims=ndims, **kwargs)
              kern2 = self.k2(ard_num_dims=ndims, **kwargs)
          else:
              kern1 = self.k1(**kwargs)
              kern2 = self.k2(**kwargs)
  
          # The patch makes sure that we're actually using KeOps
          # However, we're going to bypass KeOps and instead just use non-LazyTensors
          with patch(
              "gpytorch.kernels.keops.keops_kernel.LazyTensor",
              wraps=lambda x: x,
          ) as keops_mock:
              k1 = kern1(x1, x1).to_dense()
              k2 = kern2(x1, x1).to_dense()
              self.assertLess(torch.norm(k1 - k2), 1e-4)
  
      if use_keops:
          self.assertTrue(keops_mock.called)
  
imports: from abc import abstractmethod
  from unittest.mock import patch
  import torch
  import gpytorch
  from .base_test_case import BaseTestCase
label_desc: Use image node_id 3 for calling the BaseKeOpsTestCase obj's underlying member method code with example usage: obj.test_forward_x1_eq_x2(ard, use_keops) without return types