code: def test_warp(self, batch_size, device, dtype):
      src = torch.tensor(
          [
              [
                  [-1.0, -1.0],
                  [-1.0, 1.0],
                  [1.0, -1.0],
                  [1.0, -1.0],
                  [0.0, 0.0],
              ]
          ],
          device=device,
      ).repeat(batch_size, 1, 1)
      # zoom in by a factor of 2
      dst = src.clone() * 2.0
      tensor = torch.zeros(batch_size, 3, 8, 8, device=device)
      tensor[:, :, 2:6, 2:6] = 1.0
  
      expected = torch.ones_like(tensor)
      # nn.grid_sample interpolates the at the edges it seems, so the boundaries have values < 1
      expected[:, :, [0, -1], :] *= 0.5
      expected[:, :, :, [0, -1]] *= 0.5
  
      kernel, affine = kornia.geometry.transform.get_tps_transform(
          dst, src
      )
      warp = kornia.geometry.transform.warp_image_tps(
          tensor, src, kernel, affine
      )
      assert_close(warp, expected, atol=1e-4, rtol=1e-4)
  
imports: import pytest
  import torch
  from torch.autograd import gradcheck
  import kornia
  from kornia.testing import assert_close
  from kornia.utils._compat import torch_version_ge
label_desc: Use image node_id 2 for calling the TestWarpImage obj's underlying member method code with example usage: obj.test_warp(batch_size, device, dtype) without return types