1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use Div; use Tensor;
/*
macro_rules! add_impl {
($t:ty) => (
impl Div<Tensor<$t>> for Tensor<$t> {
type Output = Tensor<$t>;
fn div(mut self, rhs: Tensor<$t>) -> Tensor<$t> {
assert_eq!(self.shape, rhs.shape);
for i in 0..self.size() {
self.data[i] /= rhs.data[i];
}
self
}
}
impl<'a> Div<&'a Tensor<$t>> for Tensor<$t> {
type Output = Tensor<$t>;
fn div(mut self, rhs: &Tensor<$t>) -> Tensor<$t> {
if rhs.is_scalar() {
let v = rhs[0];
for i in 0..self.size() {
self.data[i] /= v;
}
} else {
assert_eq!(self.shape, rhs.shape);
for i in 0..self.size() {
self.data[i] /= rhs.data[i];
}
}
self
}
}
// TODO: Change to separate lifetimes?
impl<'a> Div<&'a Tensor<$t>> for &'a Tensor<$t> {
type Output = Tensor<$t>;
fn div(self, rhs: &Tensor<$t>) -> Tensor<$t> {
if rhs.is_scalar() {
let mut t: Tensor<$t> = self.clone();
let v = rhs[0];
for i in 0..self.size() {
t.data[i] /= v;
}
t
} else if self.is_scalar() {
let mut t: Tensor<$t> = rhs.clone();
let v = self[0];
for i in 0..self.size() {
t.data[i] /= v;
}
t
} else {
assert_eq!(self.shape, rhs.shape);
let mut t = self.clone();
for i in 0..self.size() {
t.data[i] /= rhs.data[i];
}
t
}
}
}
// T / S
impl Div<$t> for Tensor<$t> {
type Output = Tensor<$t>;
fn div(mut self, rhs: $t) -> Tensor<$t> {
for i in 0..self.size() {
self.data[i] /= rhs;
}
self
}
}
)
}
add_impl!(f32);
add_impl!(f64);
*/