code: def test_composition(self):
      U_1 = euler_angles_to_rotation_matrix(torch.rand(3) * np.pi)
      U_2 = euler_angles_to_rotation_matrix(torch.rand(3) * np.pi)
      U_3 = euler_angles_to_rotation_matrix(torch.rand(3) * np.pi)
      p_1 = (
          torch.rand(1000, 3)
          @ U_1.T
          @ torch.diag(torch.tensor([1, 0.7, 0.5]))
          @ U_1
      )
      p_2 = (
          torch.rand(1000, 3)
          @ U_2.T
          @ torch.diag(torch.tensor([1, 0.9, 0.001]))
          @ U_2
      )
      p_3 = (
          torch.rand(1000, 3)
          @ U_3.T
          @ torch.diag(torch.tensor([1, 0.0001, 0.000001]))
          @ U_3
      )
  
      data_1 = Data(pos=p_1)
      data_2 = Data(pos=p_2)
      data_3 = Data(pos=p_3)
  
      compose_filter = FCompose(
          [
              PlanarityFilter(0.5, is_leq=True),
              PlanarityFilter(0.1, is_leq=False),
          ]
      )
  
      self.assertTrue(compose_filter(data_1).item())
      self.assertFalse(compose_filter(data_2).item())
      self.assertFalse(compose_filter(data_3).item())
  
file_path: torch-points3d/test/test_filter.py
imports: import unittest
  import sys
  import os
  import numpy
  import torch
  from torch_geometric.data import Data
  from torch_points3d.core.data_transform import FCompose, PlanarityFilter, euler_angles_to_rotation_matrix
label_desc: Use image node_id 2 for calling the TestFilter obj's underlying member method code with example usage: obj.test_composition() without return types