code: def test_PCACompute(self):
      vec1 = torch.randn(3)
      vec1 = vec1 / torch.norm(vec1)
      vec2 = torch.randn(3)
      vec2 = vec2 / torch.norm(vec2)
      norm = vec1.cross(vec2) / torch.norm(vec1.cross(vec2))
      plane = torch.randn(100, 1) * vec1.view(1, 3) + torch.randn(
          100, 1
      ) * vec2.view(1, 3)
      data = Data(pos=plane)
      pca = PCACompute()
      data = pca(data)
      npt.assert_allclose(
          np.abs(data.eigenvectors[:, 0].dot(norm).item()),
          1.0,
          atol=1e-5,
      )
  
imports: import unittest
  import sys
  import os
  import torch_geometric.transforms
  import numpy
  import numpy.testing
  import torch
  from torch_geometric.data import Data
  from omegaconf.dictconfig import DictConfig
  from omegaconf.listconfig import ListConfig
  from omegaconf import OmegaConf
  from torch_points3d.core.data_transform import instantiate_transform, instantiate_transforms, GridSampling3D, MultiScaleTransform, Random3AxisRotation, AddFeatByKey, AddFeatsByKeys, RemoveAttributes, RandomDropout, ShiftVoxels, PCACompute, RandomCoordsFlip, XYZFeature, ScalePos, RandomWalkDropout, NormalizeFeature, SphereCrop, CubeCrop, RandomSphereDropout, DensityFilter, LotteryTransform, ClampBatchSize, RandomParamTransform, Select, ComposeTransform
  from torch_points3d.core.spatial_ops import RadiusNeighbourFinder, KNNInterpolate
  from torch_points3d.utils.enums import ConvolutionFormat
  from torch_points3d.datasets.multiscale_data import MultiScaleBatch
label_desc: Use image node_id 10 for calling the Testhelpers obj's underlying member method code with example usage: obj.test_PCACompute() without return types