#if !defined(TORCH_STABLE_ONLY) && !defined(TORCH_TARGET_VERSION) #pragma once // Shared cubic interpolation helpers used by both GridSampler and UpSample // kernels. Based on the Catmull-Rom spline with A=-0.75. // See // https://en.wikipedia.org/wiki/Bicubic_interpolation#Bicubic_convolution_algorithm template accscalar_t cubic_convolution1(accscalar_t x, accscalar_t A) { return ((A + 2) * x - (A + 3)) * x * x + 1; } template accscalar_t cubic_convolution2(accscalar_t x, accscalar_t A) { return ((A * x - 5 * A) * x + 8 * A) * x - 4 * A; } template void get_cubic_coefficients(accscalar_t coeffs[4], accscalar_t t) { accscalar_t A = -0.75; accscalar_t x1 = t; coeffs[0] = cubic_convolution2(x1 + 1.0, A); coeffs[1] = cubic_convolution1(x1, A); accscalar_t x2 = 1.0 - t; coeffs[2] = cubic_convolution1(x2, A); coeffs[3] = cubic_convolution2(x2 + 1.0, A); } template accscalar_t cubic_interp1d( scalar_t x0, scalar_t x1, scalar_t x2, scalar_t x3, accscalar_t t) { accscalar_t coeffs[4]; get_cubic_coefficients(coeffs, t); return x0 * coeffs[0] + x1 * coeffs[1] + x2 * coeffs[2] + x3 * coeffs[3]; } #else #error "This file should not be included when either TORCH_STABLE_ONLY or TORCH_TARGET_VERSION is defined." #endif // !defined(TORCH_STABLE_ONLY) && !defined(TORCH_TARGET_VERSION)