def test_global_pooling(self, num_points, batch_size, dimension):
        points, batch_ids = utils._create_random_point_cloud_segmented(
            batch_size,
            num_points * batch_size,
            dimension=dimension,
            equal_sized_batches=True)
        features = np.random.rand(batch_size, num_points, dimension)
        point_cloud = PointCloud(points, batch_ids)

        # max pooling
        with self.subTest(name='max_pooling'):
            PoolLayer = GlobalMaxPooling()
            pool_tf = PoolLayer(features, point_cloud)
            pool_numpy = np.empty([batch_size, dimension])
            features = features.reshape([-1, dimension])
            for i in range(batch_size):
                pool_numpy[i] = np.max(features[batch_ids == i], axis=0)
            self.assertAllClose(pool_numpy, pool_tf)
            point_cloud.set_batch_shape([batch_size // 2, 2])
            padded = PoolLayer(features, point_cloud, return_padded=True)
            self.assertTrue(padded.shape.rank > 2)

        # average pooling
        with self.subTest(name='average_pooling'):
            PoolLayer = GlobalAveragePooling()
            pool_tf = PoolLayer(features, point_cloud)
            pool_numpy = np.empty([batch_size, dimension])
            for i in range(batch_size):
                pool_numpy[i] = np.mean(features[batch_ids == i], axis=0)
            self.assertAllClose(pool_numpy, pool_tf)
            point_cloud.set_batch_shape([batch_size // 2, 2])
            padded = PoolLayer(features, point_cloud, return_padded=True)
            self.assertTrue(padded.shape.rank > 2)
    def test_local_pooling(self, num_points, num_samples, batch_size, radius,
                           dimension):
        cell_sizes = np.float32(np.repeat(radius, dimension))
        points, batch_ids = utils._create_random_point_cloud_segmented(
            batch_size, num_points, dimension=dimension)
        features = np.random.rand(num_points, dimension)
        point_cloud = PointCloud(points, batch_ids)

        point_samples, batch_ids_samples = \
            utils._create_random_point_cloud_segmented(
                batch_size, num_samples, dimension=dimension)

        point_cloud_samples = PointCloud(point_samples, batch_ids_samples)

        grid = Grid(point_cloud, cell_sizes)
        neighborhood = Neighborhood(grid, cell_sizes, point_cloud_samples)
        neighbor_ids = neighborhood._original_neigh_ids.numpy()
        features_on_neighbors = features[neighbor_ids[:, 0]]

        #max pooling
        with self.subTest(name='max_pooling_to_sampled'):
            PoolLayer = MaxPooling()
            pool_tf = PoolLayer(features, point_cloud, point_cloud_samples,
                                cell_sizes)

            pool_numpy = np.empty([num_samples, dimension])
            for i in range(num_samples):
                pool_numpy[i] = np.max(
                    features_on_neighbors[neighbor_ids[:, 1] == i], axis=0)

            self.assertAllClose(pool_tf, pool_numpy)
            point_cloud.set_batch_shape([batch_size // 2, 2])
            padded = PoolLayer(features,
                               point_cloud,
                               point_cloud_samples,
                               cell_sizes,
                               return_padded=True)
            self.assertTrue(padded.shape.rank > 2)

        #max pooling
        with self.subTest(name='average_pooling_to_sampled'):
            PoolLayer = AveragePooling()
            pool_tf = PoolLayer(features, point_cloud, point_cloud_samples,
                                cell_sizes)

            pool_numpy = np.empty([num_samples, dimension])
            for i in range(num_samples):
                pool_numpy[i] = np.mean(
                    features_on_neighbors[neighbor_ids[:, 1] == i], axis=0)

            self.assertAllClose(pool_tf, pool_numpy)
    def test_construction_methods(self, max_num_points, batch_size,
                                  batch_shape):
        points, sizes = utils._create_random_point_cloud_padded(
            max_num_points, batch_shape)
        num_points = np.sum(sizes)

        sizes_flat = sizes.reshape([batch_size])
        points_flat = points.reshape([batch_size, max_num_points, 3])
        batch_ids = np.repeat(np.arange(0, batch_size), sizes_flat)

        points_seg = np.empty([num_points, 3])
        cur_id = 0
        for pts, size in zip(points_flat, sizes_flat):
            points_seg[cur_id:cur_id + size] = pts[:size]
            cur_id += size

        pc_from_padded = PointCloud(points, sizes=sizes)
        self.assertAllEqual(batch_ids, pc_from_padded._batch_ids)
        self.assertAllClose(points_seg, pc_from_padded._points)

        pc_from_ids = PointCloud(points_seg, batch_ids)
        pc_from_ids.set_batch_shape(batch_shape)

        pc_from_sizes = PointCloud(points_seg, sizes=sizes_flat)
        pc_from_sizes.set_batch_shape(batch_shape)
        self.assertAllEqual(batch_ids, pc_from_sizes._batch_ids)

        points_from_padded = pc_from_padded.get_points(
            max_num_points=max_num_points)
        points_from_ids = pc_from_ids.get_points(max_num_points=max_num_points)
        points_from_sizes = pc_from_sizes.get_points(
            max_num_points=max_num_points)

        self.assertAllEqual(points_from_padded, points_from_ids)
        self.assertAllEqual(points_from_ids, points_from_sizes)
        self.assertAllEqual(points_from_sizes, points_from_padded)