code: def test_detach(self):
      N = 5
      for lists_to_tensors in (True, False):
          clouds = self.init_cloud(
              N,
              100,
              5,
              lists_to_tensors=lists_to_tensors,
              requires_grad=True,
          )
          for force in (False, True):
              if force:
                  clouds.points_packed()
  
              new_clouds = clouds.detach()
  
              for cloud in new_clouds.points_list():
                  self.assertFalse(cloud.requires_grad)
              for normal in new_clouds.normals_list():
                  self.assertFalse(normal.requires_grad)
              for feats in new_clouds.features_list():
                  self.assertFalse(feats.requires_grad)
  
              for attrib in [
                  "points_packed",
                  "normals_packed",
                  "features_packed",
                  "points_padded",
                  "normals_padded",
                  "features_padded",
              ]:
                  self.assertFalse(
                      getattr(new_clouds, attrib)().requires_grad
                  )
  
              self.assertCloudsEqual(clouds, new_clouds)
  
imports: import itertools
  import random
  import unittest
  import numpy
  import torch
  from pytorch3d.structures import utils
  from pytorch3d.structures.pointclouds import join_pointclouds_as_batch, join_pointclouds_as_scene, Pointclouds
  from .common_testing import TestCaseMixin
label_desc: Use image node_id 12 for calling the TestPointclouds obj's underlying member method code with example usage: obj.test_detach() without return types