code: def perform_pointnet_block_test(
      batch_dim: int,
      num_points: int,
      num_features: int,
      embedding_dim: int,
      use_batch_norm: bool,
      pooling_func_str: str,
      use_feature_transform: bool,
      with_masking: bool,
      with_output_features: bool,
  ):
      """Perform test on point net"""
      if not with_masking:
          in_dict = build_input_dict(
              dims=[batch_dim, num_points, num_features]
          )
          in_shapes = (num_points, num_features)
      else:
          in_dict = build_multi_input_dict(
              dims=[
                  [batch_dim, num_points, num_features],
                  [batch_dim, num_points],
              ]
          )
          in_dict["in_key_1"] = in_dict["in_key_1"] != 0
          in_dict["in_key_1"][:, -1] = 0
          in_shapes = [(num_points, num_features), (num_points,)]
  
      out_keys = (
          "out_key_latent"
          if not with_output_features
          else ["out_key_latent", "out_key_features"]
      )
  
      pointnet_block = PointNetFeatureBlock(
          in_keys=list(in_dict.keys()),
          in_shapes=in_shapes,
          out_keys=out_keys,
          use_batch_norm=use_batch_norm,
          non_lin=torch.nn.ReLU,
          embedding_dim=embedding_dim,
          pooling_func_name=pooling_func_str,
          use_feature_transform=use_feature_transform,
      )
      pointnet_block.print_internal_shape_representation = True
  
      str(pointnet_block)
      block_output = pointnet_block(in_dict)
      out = block_output["out_key_latent"]
      assert out.shape == torch.Size([batch_dim, embedding_dim])
  
      if with_output_features:
          out_f = block_output["out_key_features"]
          assert out_f.shape == torch.Size(
              [batch_dim, num_points, embedding_dim // 16]
          )
  
file_path: maze/maze/test/perception/blocks/test_point_net.py
imports: import pytest
  import torch
  from maze.perception.blocks.feed_forward.point_net import PointNetFeatureTransformNet, PointNetFeatureBlock
  from maze.test.perception.perception_test_utils import build_input_dict, build_multi_input_dict
label_desc: Use image node_id 4 for calling a global function with example usage: perform_pointnet_block_test(batch_dim, num_points, num_features, embedding_dim, use_batch_norm, pooling_func_str, use_feature_transform, with_masking, with_output_features) without return types