use {ruda_kernel::dsl::Runtime, ruda_kernel::tensor::RudaTensor};
use {ruda_core::tensor::spatial::ConvTransposeOptions};
use {crate::convolution::components::ConvSetupError};
#[cfg(feature = "tensor-convolution-autotune")]
use {super::conv_transpose2d_autotune};
use {super::conv_transpose2d_col2im, super::conv_transpose2d_direct};
pub enum ConvTranspose2dStrategy {
Direct,
#[cfg(feature = "tensor-convolution-autotune")]
Autotune,
Gemm,
}
impl Default for ConvTranspose2dStrategy {
fn default() -> Self {
#[cfg(feature = "tensor-convolution-autotune")]
return ConvTranspose2dStrategy::Autotune;
#[cfg(not(feature = "tensor-convolution-autotune"))]
ConvTranspose2dStrategy::Direct
}
}
pub fn conv_transpose2d<R: Runtime>(
input: RudaTensor<R>,
weight: RudaTensor<R>,
bias: Option<RudaTensor<R>>,
options: ConvTransposeOptions<2>,
strategy: ConvTranspose2dStrategy,
) -> Result<RudaTensor<R>, ConvSetupError> {
match strategy {
ConvTranspose2dStrategy::Direct => conv_transpose2d_direct(input, weight, bias, options),
#[cfg(feature = "tensor-convolution-autotune")]
ConvTranspose2dStrategy::Autotune => {
Ok(conv_transpose2d_autotune(input, weight, bias, options))
}
ConvTranspose2dStrategy::Gemm => conv_transpose2d_col2im(input, weight, bias, options),
}
}