AdaptivePooling.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #if !defined(TORCH_STABLE_ONLY) && !defined(TORCH_TARGET_VERSION)
  2. #pragma once
  3. #include <ATen/core/Tensor.h>
  4. #include <ATen/native/DispatchStub.h>
  5. #include <c10/util/ArrayRef.h>
  6. #include <c10/util/irange.h>
  7. #include <cmath>
  8. namespace at::native {
  9. using adaptive_avg_pooling2d_fn = void(*)(Tensor& output, const Tensor& input, IntArrayRef output_size);
  10. using adaptive_avg_pooling2d_backward_fn = void(*)(Tensor& grad_input, const Tensor& grad_output);
  11. DECLARE_DISPATCH(adaptive_avg_pooling2d_fn, adaptive_avg_pool2d_kernel)
  12. DECLARE_DISPATCH(adaptive_avg_pooling2d_backward_fn, adaptive_avg_pool2d_backward_kernel)
  13. using adaptive_max_pooling2d_fn = void(*)(const Tensor& output, const Tensor& indices, const Tensor& input, IntArrayRef output_size);
  14. using adaptive_max_pooling2d_backward_fn = void(*)(const Tensor& grad_input, const Tensor& grad_output, const Tensor& indices);
  15. DECLARE_DISPATCH(adaptive_max_pooling2d_fn, adaptive_max_pool2d_kernel)
  16. DECLARE_DISPATCH(adaptive_max_pooling2d_backward_fn, adaptive_max_pool2d_backward_kernel)
  17. using adaptive_avg_pooling3d_fn = void(*)(Tensor& output, const Tensor& input, IntArrayRef output_size);
  18. using adaptive_avg_pooling3d_backward_fn = void(*)(Tensor& grad_input, const Tensor& grad_output);
  19. DECLARE_DISPATCH(adaptive_avg_pooling3d_fn, adaptive_avg_pool3d_kernel)
  20. DECLARE_DISPATCH(adaptive_avg_pooling3d_backward_fn, adaptive_avg_pool3d_backward_kernel)
  21. using adaptive_max_pooling3d_fn = void(*)(const Tensor& output, const Tensor& indices, const Tensor& input, IntArrayRef output_size);
  22. using adaptive_max_pooling3d_backward_fn = void(*)(const Tensor& grad_input, const Tensor& grad_output, const Tensor& indices);
  23. DECLARE_DISPATCH(adaptive_max_pooling3d_fn, adaptive_max_pool3d_kernel)
  24. DECLARE_DISPATCH(adaptive_max_pooling3d_backward_fn, adaptive_max_pool3d_backward_kernel)
  25. inline int64_t start_index(int64_t a, int64_t b, int64_t c) {
  26. return (a / b) * c + ((a % b) * c) / b;
  27. }
  28. inline int64_t end_index(int64_t a, int64_t b, int64_t c) {
  29. return 1 + ((a + 1) * c - 1) / b;
  30. }
  31. inline void adaptive_pool_empty_output_check(const Tensor& gradOutput_, const char* arg_name) {
  32. int64_t ndim = gradOutput_.ndimension();
  33. for (const auto i : c10::irange(1, ndim)) {
  34. TORCH_CHECK(gradOutput_.size(i) > 0,
  35. arg_name, "(): Expected grad_output to have non-zero size for non-batch dimensions, "
  36. "but grad_output has sizes ", gradOutput_.sizes(), " with dimension ", i,
  37. " being empty");
  38. }
  39. }
  40. } // namespace at::native
  41. #else
  42. #error "This file should not be included when either TORCH_STABLE_ONLY or TORCH_TARGET_VERSION is defined."
  43. #endif // !defined(TORCH_STABLE_ONLY) && !defined(TORCH_TARGET_VERSION)