use crate::Tensor;
use std::ops::{Add, Div, Mul, Sub};
#[cfg(feature = "dynamic")]
#[inline(always)]
fn require_numeric(t: &crate::Tensor, operation: &'static str) {
if t.is_dynamic() {
panic!(
"matten unsupported error in {operation}: scalar arithmetic is not supported on dynamic tensors; call try_numeric() first"
);
}
}
impl Add<f64> for &Tensor {
type Output = Tensor;
fn add(self, rhs: f64) -> Tensor {
#[cfg(feature = "dynamic")]
require_numeric(self, "add");
Tensor {
data: self.data.iter().map(|&v| v + rhs).collect(),
shape: self.shape.clone(),
#[cfg(feature = "dynamic")]
dynamic: None,
}
}
}
impl Sub<f64> for &Tensor {
type Output = Tensor;
fn sub(self, rhs: f64) -> Tensor {
#[cfg(feature = "dynamic")]
require_numeric(self, "sub");
Tensor {
data: self.data.iter().map(|&v| v - rhs).collect(),
shape: self.shape.clone(),
#[cfg(feature = "dynamic")]
dynamic: None,
}
}
}
impl Mul<f64> for &Tensor {
type Output = Tensor;
fn mul(self, rhs: f64) -> Tensor {
#[cfg(feature = "dynamic")]
require_numeric(self, "mul");
Tensor {
data: self.data.iter().map(|&v| v * rhs).collect(),
shape: self.shape.clone(),
#[cfg(feature = "dynamic")]
dynamic: None,
}
}
}
impl Div<f64> for &Tensor {
type Output = Tensor;
fn div(self, rhs: f64) -> Tensor {
#[cfg(feature = "dynamic")]
require_numeric(self, "div");
Tensor {
data: self.data.iter().map(|&v| v / rhs).collect(),
shape: self.shape.clone(),
#[cfg(feature = "dynamic")]
dynamic: None,
}
}
}
impl Add<&Tensor> for f64 {
type Output = Tensor;
fn add(self, rhs: &Tensor) -> Tensor {
#[cfg(feature = "dynamic")]
require_numeric(rhs, "add (scalar-left)");
Tensor {
data: rhs.data.iter().map(|&v| self + v).collect(),
shape: rhs.shape.clone(),
#[cfg(feature = "dynamic")]
dynamic: None,
}
}
}
impl Sub<&Tensor> for f64 {
type Output = Tensor;
fn sub(self, rhs: &Tensor) -> Tensor {
#[cfg(feature = "dynamic")]
require_numeric(rhs, "sub (scalar-left)");
Tensor {
data: rhs.data.iter().map(|&v| self - v).collect(),
shape: rhs.shape.clone(),
#[cfg(feature = "dynamic")]
dynamic: None,
}
}
}
impl Mul<&Tensor> for f64 {
type Output = Tensor;
fn mul(self, rhs: &Tensor) -> Tensor {
#[cfg(feature = "dynamic")]
require_numeric(rhs, "mul (scalar-left)");
Tensor {
data: rhs.data.iter().map(|&v| self * v).collect(),
shape: rhs.shape.clone(),
#[cfg(feature = "dynamic")]
dynamic: None,
}
}
}
impl Div<&Tensor> for f64 {
type Output = Tensor;
fn div(self, rhs: &Tensor) -> Tensor {
#[cfg(feature = "dynamic")]
require_numeric(rhs, "div (scalar-left)");
Tensor {
data: rhs.data.iter().map(|&v| self / v).collect(),
shape: rhs.shape.clone(),
#[cfg(feature = "dynamic")]
dynamic: None,
}
}
}