use snafu::ResultExt;
use svod_dtype::DType;
use svod_ir::shape::to_vec_usize;
use crate::{Result, Tensor, UOpSnafu};
impl Tensor {
pub fn rand_like_with_dtype(&self, dtype: DType) -> Result<Tensor> {
let shape = to_vec_usize(&self.shape()?).context(UOpSnafu)?;
Self::rand_with(&shape, dtype, self.device())
}
pub fn rand_like(&self) -> Result<Tensor> {
self.rand_like_with_dtype(self.uop().dtype())
}
pub fn randn_like_with_dtype(&self, dtype: DType) -> Result<Tensor> {
let shape = to_vec_usize(&self.shape()?).context(UOpSnafu)?;
Tensor::randn(&shape)?.cast(dtype)
}
pub fn randn_like(&self) -> Result<Tensor> {
self.randn_like_with_dtype(self.uop().dtype())
}
pub fn randint_like(&self, low: i64, high: i64) -> Result<Tensor> {
let shape = to_vec_usize(&self.shape()?).context(UOpSnafu)?;
let r = Tensor::randint(&shape, low, high)?;
if r.uop().dtype() == self.uop().dtype() { Ok(r) } else { r.cast(self.uop().dtype()) }
}
}