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
80
81
82
use super::GenTensor;
use crate::tensor_trait::rand::Random;
use rand::prelude::*;
use rand::Rng;
use rand_distr::{Normal, Uniform, Distribution, StandardNormal};
impl<T> Random for GenTensor<T>
where T: num_traits::Float + rand_distr::uniform::SampleUniform,
StandardNormal: Distribution<T> {
type TensorType = GenTensor<T>;
type ElementType = T;
fn rand_usize(rng: &mut StdRng,
dim: &[usize],
left: usize, right: usize) -> Self::TensorType {
let elem = dim.iter().product();
let mut dta = Vec::<Self::ElementType>::with_capacity(elem);
for _i in 0..elem {
let v: usize = rng.gen_range(left..right);
dta.push(T::from(v).unwrap());
}
GenTensor::new_raw(&dta, dim)
}
fn bernoulli() -> Self::TensorType {
unimplemented!();
}
fn cauchy() -> Self::TensorType {
unimplemented!();
}
fn exponential() -> Self::TensorType {
unimplemented!();
}
fn geometric() -> Self::TensorType {
unimplemented!();
}
fn log_normal() -> Self::TensorType {
unimplemented!();
}
fn normal(rng: &mut StdRng,
dim: &[usize],
mean: Self::ElementType,
std: Self::ElementType) -> Self::TensorType {
let elem = dim.iter().product();
let mut dta = Vec::<Self::ElementType>::with_capacity(elem);
let normal = Normal::<Self::ElementType>::new(mean, std).expect("");
for _i in 0..elem {
dta.push(normal.sample(rng));
}
GenTensor::new_raw(&dta, dim)
}
fn uniform(rng: &mut StdRng,
dim: &[usize],
from: Self::ElementType,
to: Self::ElementType) -> Self::TensorType {
let elem: usize = dim.iter().product();
let mut dta = Vec::<Self::ElementType>::with_capacity(elem);
let normal = Uniform::<Self::ElementType>::new(from, to);
for _i in 0..elem {
dta.push(normal.sample(rng));
}
GenTensor::new_raw(&dta, dim)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::tensor_trait::compare_tensor::CompareTensor;
#[test]
fn normalize_unit() {
let mut rng = StdRng::seed_from_u64(671);
let m = GenTensor::<f64>::uniform(&mut rng, &[2,2], 0., 10.);
assert!(GenTensor::<f64>::fill(10., &[2,2]).sub(&m).all(&|x| x > 0. && x < 10.));
}
}