def forward(self, seed_points, seed_feats):
    'forward.\n\n        Args:\n            seed_points (torch.Tensor): Coordinate of the seed\n                points in shape (B, N, 3).\n            seed_feats (torch.Tensor): Features of the seed points in shape\n                (B, C, N).\n\n        Returns:\n            tuple[torch.Tensor]:\n\n                - vote_points: Voted xyz based on the seed points                     with shape (B, M, 3), ``M=num_seed*vote_per_seed``.\n                - vote_features: Voted features based on the seed points with                     shape (B, C, M) where ``M=num_seed*vote_per_seed``,                     ``C=vote_feature_dim``.\n        '
    (batch_size, feat_channels, num_seed) = seed_feats.shape
    num_vote = (num_seed * self.vote_per_seed)
    x = self.vote_conv(seed_feats)
    votes = self.conv_out(x)
    votes = votes.transpose(2, 1).view(batch_size, num_seed, self.vote_per_seed, (- 1))
    offset = votes[:, :, :, 0:3]
    res_feats = votes[:, :, :, 3:]
    vote_points = (seed_points.unsqueeze(2) + offset).contiguous()
    vote_points = vote_points.view(batch_size, num_vote, 3)
    vote_feats = (seed_feats.transpose(2, 1).unsqueeze(2) + res_feats).contiguous()
    vote_feats = vote_feats.view(batch_size, num_vote, feat_channels).transpose(2, 1).contiguous()
    if self.norm_feats:
        features_norm = torch.norm(vote_feats, p=2, dim=1)
        vote_feats = vote_feats.div(features_norm.unsqueeze(1))
    return (vote_points, vote_feats)
forward.

Args:
    seed_points (torch.Tensor): Coordinate of the seed
        points in shape (B, N, 3).
    seed_feats (torch.Tensor): Features of the seed points in shape
        (B, C, N).

Returns:
    tuple[torch.Tensor]:

        - vote_points: Voted xyz based on the seed points                     with shape (B, M, 3), ``M=num_seed*vote_per_seed``.
        - vote_features: Voted features based on the seed points with                     shape (B, C, M) where ``M=num_seed*vote_per_seed``,                     ``C=vote_feature_dim``.
def forward(self, seed_points, seed_feats):
    'forward.\n\n        Args:\n            seed_points (torch.Tensor): Coordinate of the seed\n                points in shape (B, N, 3).\n            seed_feats (torch.Tensor): Features of the seed points in shape\n                (B, C, N).\n\n        Returns:\n            tuple[torch.Tensor]:\n\n                - vote_points: Voted xyz based on the seed points                     with shape (B, M, 3), ``M=num_seed*vote_per_seed``.\n                - vote_features: Voted features based on the seed points with                     shape (B, C, M) where ``M=num_seed*vote_per_seed``,                     ``C=vote_feature_dim``.\n        '
    (batch_size, feat_channels, num_seed) = seed_feats.shape
    num_vote = (num_seed * self.vote_per_seed)
    x = self.vote_conv(seed_feats)
    votes = self.conv_out(x)
    votes = votes.transpose(2, 1).view(batch_size, num_seed, self.vote_per_seed, (- 1))
    offset = votes[:, :, :, 0:3]
    res_feats = votes[:, :, :, 3:]
    vote_points = (seed_points.unsqueeze(2) + offset).contiguous()
    vote_points = vote_points.view(batch_size, num_vote, 3)
    vote_feats = (seed_feats.transpose(2, 1).unsqueeze(2) + res_feats).contiguous()
    vote_feats = vote_feats.view(batch_size, num_vote, feat_channels).transpose(2, 1).contiguous()
    if self.norm_feats:
        features_norm = torch.norm(vote_feats, p=2, dim=1)
        vote_feats = vote_feats.div(features_norm.unsqueeze(1))
    return (vote_points, vote_feats)