use crate::{Backend, tensor::FloatTensor};
use core::fmt::Debug;
pub trait TensorCollective<B: Backend>: Clone + Debug + Send + 'static {
type Error: Debug;
fn world_size(&self) -> u32;
fn all_gather_float(&self, value: FloatTensor<B>) -> Result<FloatTensor<B>, Self::Error>;
fn reduce_scatter_sum(&self, value: FloatTensor<B>) -> Result<FloatTensor<B>, Self::Error>;
}
pub trait ReplicatedTensorCollective<B: Backend>: TensorCollective<B> {
fn all_reduce_sum(&self, value: FloatTensor<B>) -> Result<FloatTensor<B>, Self::Error>;
}
pub trait BroadcastTensorCollective<B: Backend>: ReplicatedTensorCollective<B> {
fn rank(&self) -> u32;
fn broadcast_float(
&self,
value: FloatTensor<B>,
root: u32,
) -> Result<FloatTensor<B>, Self::Error>;
}