code: def _test_rmatmul(self, lhs):
      lazy_tensor = self.create_linear_op().requires_grad_(True)
      lazy_tensor_copy = (
          lazy_tensor.clone().detach_().requires_grad_(True)
      )
      evaluated = self.evaluate_linear_op(lazy_tensor_copy)
  
      res = lhs @ lazy_tensor
      actual = lhs @ evaluated
      self.assertAllClose(res, actual)
  
      grad = torch.randn_like(res)
      res.backward(gradient=grad)
      actual.backward(gradient=grad)
      for param, param_copy in zip(
          lazy_tensor.kernel.parameters(),
          lazy_tensor_copy.kernel.parameters(),
      ):
          self.assertAllClose(param.grad, param_copy.grad, rtol=1e-3)
      self.assertAllClose(
          lazy_tensor.x1.grad + lazy_tensor.x2.grad,
          lazy_tensor_copy.x1.grad + lazy_tensor_copy.x2.grad,
          rtol=1e-3,
          atol=1e-4,
      )
  
imports: import math
  import unittest
  from unittest.mock import MagicMock, patch
  import linear_operator
  import torch
  from linear_operator import to_dense
  from linear_operator.test.linear_operator_test_case import LinearOperatorTestCase
  import gpytorch
label_desc: Use image node_id 4 for calling the TestLazyEvaluatedKernelTensorBatch obj's underlying member method code with example usage: obj._test_rmatmul(lhs) without return types