pub mod tensor;
pub mod vec;
pub use tensor::*;
pub use vec::*;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn add() {
let shape = [2, 2];
let data1 = vec![1, 2, 3, 4];
let data2 = vec![5, 6, 7, 8];
let t1 = Tensor::<i32, 2>::new_vec(&data1);
let t2 = Tensor::<i32, 2>::new_vec(&data2);
let t_add = (t1.clone() + t2.clone()).reshape(shape);
assert_eq!(t_add, Tensor::new(vec![6, 8, 10, 12], shape));
}
#[test]
fn broadcast() {
let shape = [2, 2];
let data1 = vec![1, 2, 3, 4];
let data2 = vec![5];
let t1 = Tensor::<i32, 2>::new_vec(&data1);
println!("T1: {:?}", t1);
let t2 = Tensor::<i32, 2>::new_vec(&data2).broadcast(&t1).unwrap();
println!("T2: {:?}", t2);
let t_add = (t1.clone() + t2.clone()).reshape(shape);
assert_eq!(t_add, Tensor::new(vec![6, 7, 8, 9], shape));
}
#[test]
fn broadcast_inplace() {
let shape = [2, 2];
let data1 = vec![1, 2, 3, 4];
let data2 = vec![5];
let t1 = Tensor::<i32, 2>::new_vec(&data1);
println!("T1: {:?}", t1);
let mut t2 = Tensor::<i32, 2>::new_vec(&data2);
t2.broadcast_inplace([4]);
println!("T2: {:?}", t2);
let t_add = (t1.clone() + t2.clone()).reshape(shape);
assert_eq!(t_add, Tensor::new(vec![6, 7, 8, 9], shape));
}
#[test]
fn div() {
let shape = [2, 2];
let data1 = vec![1.0, 2.0, 3.5, 4.0];
let data2 = vec![5.0, 4.0, 7.0, 8.0];
let t1 = Tensor::new(data1, shape);
let t2 = Tensor::new(data2, shape);
let t_div = t1.clone() / t2.clone();
assert_eq!(t_div, Tensor::new(vec![0.2, 0.5, 0.5, 0.5], shape));
}
#[test]
fn dot() {
let shape = [4];
let data1 = vec![1, 2, 3, 4];
let data2 = vec![5, 6, 7, 8];
let v1 = Tensor::new(data1, shape);
let v2 = Tensor::new(data2, shape);
let dp = v1.dot(&v2);
assert_eq!(dp, 70);
}
#[test]
fn mul() {
let shape = [2, 2];
let data1 = vec![1, 2, 3, 4];
let data2 = vec![5, 6, 7, 8];
let t1 = Tensor::new(data1, shape);
let t2 = Tensor::new(data2, shape);
let t_mul = t1.clone() * t2.clone();
assert_eq!(t_mul, Tensor::new(vec![5, 12, 21, 32], shape));
}
#[test]
fn new() {
let shape = [2, 2];
let data = vec![1, 2, 3, 4];
let tensor = Tensor::new(data, shape);
assert_eq!(tensor.shape(), &[2, 2]);
assert_eq!(tensor.data, &[1, 2, 3, 4]);
}
#[test]
fn sub() {
let shape = [2, 2];
let data1 = vec![1, 2, 3, 4];
let data2 = vec![5, 6, 7, 8];
let t1 = Tensor::new(data1, shape);
let t2 = Tensor::new(data2, shape);
let t_sub = t1.clone() - t2.clone();
assert_eq!(t_sub, Tensor::new(vec![-4, -4, -4, -4], shape));
}
#[test]
fn vec_dot() {
let v1 = vec![1, 2, 3, 4];
let v2 = vec![5, 6, 7, 8];
let dp = v1.dot(&v2);
assert_eq!(dp, 70);
}
}