code: def test_abs_signed_distance(self, device, dtype, shape):
      p0 = Vector3.random(shape, device, dtype)
      p1 = Vector3.random(shape, device, dtype)
  
      n0 = Vector3.random(shape, device, dtype).normalized()
      n1 = Vector3.random(shape, device, dtype).normalized()
  
      s0 = torch.rand(shape or (), device=device, dtype=dtype)
      s1 = torch.rand(shape or (), device=device, dtype=dtype)
  
      pl0 = Hyperplane.from_vector(n0, p0)
      pl1 = Hyperplane.from_vector(n1, p1)
  
      expected = torch.ones(shape or (), device=device, dtype=dtype)
      self.assert_close(
          pl1.signed_distance(p1 + n1 * s0[..., None]), s0
      )
      assert (pl0.abs_distance(p0) < expected).all()
      assert (pl1.signed_distance(pl1.projection(p0)) < expected).all()
      assert (pl1.abs_distance(p1 + pl1.normal * s1) < expected).all()
  
imports: import pytest
  import torch
  from kornia.geometry.plane import Hyperplane, fit_plane
  from kornia.geometry.vector import Vector3
  from kornia.testing import BaseTester
label_desc: Use image node_id 4 for calling the TestHyperplane obj's underlying member method code with example usage: obj.test_abs_signed_distance(device, dtype, shape) without return types