| 131 | |
| 132 | |
| 133 | class Aggregation(Function): |
| 134 | @staticmethod |
| 135 | def forward(ctx, input, position, weight, idx): |
| 136 | """ |
| 137 | input: input: (n, c), position: (n, nsample, c), weight : (n, nsample, c'), idx: (n, nsample) |
| 138 | output: (n, c) |
| 139 | """ |
| 140 | assert input.is_contiguous() and position.is_contiguous() and weight.is_contiguous() |
| 141 | n, nsample, c = position.shape; w_c = weight.shape[-1] |
| 142 | output = torch.cuda.FloatTensor(n, c).zero_() |
| 143 | pointops_cuda.aggregation_forward_cuda(n, nsample, c, w_c, input, position, weight, idx, output) |
| 144 | ctx.save_for_backward(input, position, weight, idx) |
| 145 | return output |
| 146 | |
| 147 | @staticmethod |
| 148 | def backward(ctx, grad_output): |
| 149 | """ |
| 150 | input: grad_out: (n, c) |
| 151 | output: grad_input: (n, c), grad_position: (n, nsample, c), grad_weight : (n, nsample, c') |
| 152 | """ |
| 153 | input, position, weight, idx = ctx.saved_tensors |
| 154 | n, nsample, c = position.shape; w_c = weight.shape[-1] |
| 155 | grad_input = torch.cuda.FloatTensor(n, c).zero_() |
| 156 | grad_position = torch.cuda.FloatTensor(n, nsample, c).zero_() |
| 157 | grad_weight = torch.cuda.FloatTensor(n, nsample, w_c).zero_() |
| 158 | pointops_cuda.aggregation_backward_cuda(n, nsample, c, w_c, input, position, weight, idx, grad_output, grad_input, grad_position, grad_weight) |
| 159 | return grad_input, grad_position, grad_weight, None |
| 160 | |
| 161 | aggregation = Aggregation.apply |
| 162 |
nothing calls this directly
no outgoing calls
no test coverage detected