use fuel_ir::conv::{ParamsConv1D, ParamsConv2D, ParamsConvTranspose1D, ParamsConvTranspose2D};
use fuel_ir::op::{BinaryOp, CmpOp, ReduceOp, UnaryOp};
use fuel_ir::{DType, DeviceLocation, HostBuffer, Layout, Result, Scalar, Shape};
use std::any::Any;
use std::sync::Arc;
pub trait DynBackendStorage: Send + Sync + std::fmt::Debug {
fn try_clone_dyn(&self, layout: &Layout) -> Result<Box<dyn DynBackendStorage>>;
fn dtype_dyn(&self) -> DType;
fn device_dyn(&self) -> &dyn DynBackendDevice;
fn device_arc_dyn(&self) -> Arc<dyn DynBackendDevice>;
fn to_host_buffer_dyn(&self) -> Result<HostBuffer>;
fn to_cpu_storage_dyn(&self) -> Result<HostBuffer> {
self.to_host_buffer_dyn()
}
fn affine_dyn(&self, layout: &Layout, mul: f64, add: f64)
-> Result<Box<dyn DynBackendStorage>>;
fn powf_dyn(&self, layout: &Layout, e: f64) -> Result<Box<dyn DynBackendStorage>>;
fn elu_dyn(&self, layout: &Layout, alpha: f64) -> Result<Box<dyn DynBackendStorage>>;
fn reduce_op_dyn(
&self,
op: ReduceOp,
layout: &Layout,
axes: &[usize],
) -> Result<Box<dyn DynBackendStorage>>;
fn cmp_dyn(
&self,
op: CmpOp,
rhs: &dyn DynBackendStorage,
lhs_layout: &Layout,
rhs_layout: &Layout,
) -> Result<Box<dyn DynBackendStorage>>;
fn to_dtype_dyn(&self, layout: &Layout, dtype: DType) -> Result<Box<dyn DynBackendStorage>>;
fn unary_op_dyn(&self, layout: &Layout, op: UnaryOp) -> Result<Box<dyn DynBackendStorage>>;
fn binary_op_dyn(
&self,
rhs: &dyn DynBackendStorage,
lhs_layout: &Layout,
rhs_layout: &Layout,
op: BinaryOp,
) -> Result<Box<dyn DynBackendStorage>>;
fn where_cond_dyn(
&self,
cond_layout: &Layout,
on_true: &dyn DynBackendStorage,
on_true_layout: &Layout,
on_false: &dyn DynBackendStorage,
on_false_layout: &Layout,
) -> Result<Box<dyn DynBackendStorage>>;
fn conv1d_dyn(
&self,
l: &Layout,
kernel: &dyn DynBackendStorage,
kernel_l: &Layout,
params: &ParamsConv1D,
) -> Result<Box<dyn DynBackendStorage>>;
fn conv_transpose1d_dyn(
&self,
l: &Layout,
kernel: &dyn DynBackendStorage,
kernel_l: &Layout,
params: &ParamsConvTranspose1D,
) -> Result<Box<dyn DynBackendStorage>>;
fn conv2d_dyn(
&self,
l: &Layout,
kernel: &dyn DynBackendStorage,
kernel_l: &Layout,
params: &ParamsConv2D,
) -> Result<Box<dyn DynBackendStorage>>;
fn conv_transpose2d_dyn(
&self,
l: &Layout,
kernel: &dyn DynBackendStorage,
kernel_l: &Layout,
params: &ParamsConvTranspose2D,
) -> Result<Box<dyn DynBackendStorage>>;
fn avg_pool2d_dyn(
&self,
layout: &Layout,
kernel: (usize, usize),
stride: (usize, usize),
) -> Result<Box<dyn DynBackendStorage>>;
fn max_pool2d_dyn(
&self,
layout: &Layout,
kernel: (usize, usize),
stride: (usize, usize),
) -> Result<Box<dyn DynBackendStorage>>;
fn upsample_nearest1d_dyn(
&self,
layout: &Layout,
target_size: usize,
) -> Result<Box<dyn DynBackendStorage>>;
fn upsample_nearest2d_dyn(
&self,
layout: &Layout,
target_h: usize,
target_w: usize,
) -> Result<Box<dyn DynBackendStorage>>;
fn upsample_bilinear2d_dyn(
&self,
layout: &Layout,
target_h: usize,
target_w: usize,
align_corners: bool,
scale_h: Option<f64>,
scale_w: Option<f64>,
) -> Result<Box<dyn DynBackendStorage>>;
fn gather_dyn(
&self,
src_layout: &Layout,
ids: &dyn DynBackendStorage,
ids_layout: &Layout,
dim: usize,
) -> Result<Box<dyn DynBackendStorage>>;
fn scatter_set_dyn(
&mut self,
self_layout: &Layout,
src: &dyn DynBackendStorage,
src_layout: &Layout,
ids: &dyn DynBackendStorage,
ids_layout: &Layout,
dim: usize,
) -> Result<()>;
fn scatter_add_set_dyn(
&mut self,
self_layout: &Layout,
src: &dyn DynBackendStorage,
src_layout: &Layout,
ids: &dyn DynBackendStorage,
ids_layout: &Layout,
dim: usize,
) -> Result<()>;
fn index_select_dyn(
&self,
ids: &dyn DynBackendStorage,
src_layout: &Layout,
ids_layout: &Layout,
dim: usize,
) -> Result<Box<dyn DynBackendStorage>>;
fn index_add_dyn(
&self,
self_layout: &Layout,
ids: &dyn DynBackendStorage,
ids_layout: &Layout,
src: &dyn DynBackendStorage,
src_layout: &Layout,
dim: usize,
) -> Result<Box<dyn DynBackendStorage>>;
fn matmul_dyn(
&self,
rhs: &dyn DynBackendStorage,
bmnk: (usize, usize, usize, usize),
lhs_layout: &Layout,
rhs_layout: &Layout,
) -> Result<Box<dyn DynBackendStorage>>;
fn copy_strided_src_dyn(
&self,
dst: &mut dyn DynBackendStorage,
dst_offset: usize,
src_layout: &Layout,
) -> Result<()>;
fn copy2d_dyn(
&self,
dst: &mut dyn DynBackendStorage,
d1: usize,
d2: usize,
src_stride1: usize,
dst_stride1: usize,
src_offset: usize,
dst_offset: usize,
) -> Result<()>;
fn const_set_dyn(&mut self, value: Scalar, layout: &Layout) -> Result<()>;
fn as_any(&self) -> &dyn Any;
fn as_any_mut(&mut self) -> &mut dyn Any;
}
pub trait DynBackendDevice: Send + Sync + std::fmt::Debug {
fn location_dyn(&self) -> DeviceLocation;
fn same_device_dyn(&self, other: &dyn DynBackendDevice) -> bool;
fn supports_bf16(&self) -> bool {
false
}
fn zeros_impl_dyn(&self, shape: &Shape, dtype: DType) -> Result<Box<dyn DynBackendStorage>>;
unsafe fn alloc_uninit_dyn(
&self,
shape: &Shape,
dtype: DType,
) -> Result<Box<dyn DynBackendStorage>>;
fn storage_from_host_buffer_dyn(&self, buf: &HostBuffer) -> Result<Box<dyn DynBackendStorage>>;
fn storage_from_host_buffer_owned_dyn(
&self,
buf: HostBuffer,
) -> Result<Box<dyn DynBackendStorage>>;
fn storage_from_cpu_storage_dyn(&self, cpu: &HostBuffer) -> Result<Box<dyn DynBackendStorage>> {
self.storage_from_host_buffer_dyn(cpu)
}
fn storage_from_cpu_storage_owned_dyn(
&self,
cpu: HostBuffer,
) -> Result<Box<dyn DynBackendStorage>> {
self.storage_from_host_buffer_owned_dyn(cpu)
}
fn rand_uniform_dyn(
&self,
shape: &Shape,
dtype: DType,
lo: f64,
hi: f64,
) -> Result<Box<dyn DynBackendStorage>>;
fn rand_normal_dyn(
&self,
shape: &Shape,
dtype: DType,
mean: f64,
std: f64,
) -> Result<Box<dyn DynBackendStorage>>;
fn set_seed_dyn(&self, seed: u64) -> Result<()>;
fn get_current_seed_dyn(&self) -> Result<u64>;
fn synchronize_dyn(&self) -> Result<()>;
fn as_any(&self) -> &dyn Any;
fn as_quantized_kernels(&self) -> Option<&dyn crate::quantized::QuantizedDeviceKernels> {
None
}
fn as_backend_runtime(&self) -> Option<&dyn crate::backend::BackendRuntime> {
None
}
}