tch 0.13.0

Rust wrappers for the PyTorch C++ api (libtorch).
Documentation
use tch::{kind, Tensor};

#[test]
fn display_scalar() {
    let t = Tensor::ones([], kind::INT64_CPU) * (-1234);
    let s = format!("{t}");
    assert_eq!(&s, "[-1234]\nTensor[[], Int64]");
    let s = format!("{}", &t / 10.0);
    assert_eq!(&s, "[-123.4000]\nTensor[[], Float]");
    let s = format!("{}", &t / 1e8);
    assert_eq!(&s, "[-1.2340e-5]\nTensor[[], Float]");
    let s = format!("{}", &t * 1e8);
    assert_eq!(&s, "[-1.2340e11]\nTensor[[], Float]");
    let s = format!("{}", &t * 0.);
    assert_eq!(&s, "[-0.]\nTensor[[], Float]");
    let s = format!("{}", &t * (-0.));
    assert_eq!(&s, "[0.]\nTensor[[], Float]");
    let s = format!("{}", &t.eq_tensor(&t));
    assert_eq!(&s, "[true]\nTensor[[], Bool]");
    let s = format!("{}", &t.not_equal_tensor(&t));
    assert_eq!(&s, "[false]\nTensor[[], Bool]");
}

#[test]
fn display_vector() {
    let t = Tensor::from_slice::<i64>(&[]);
    let s = format!("{t}");
    assert_eq!(&s, "[]\nTensor[[0], Int64]");
    let t = Tensor::from_slice(&[0.1234567, 1.0, -1.2, 4.1, f64::NAN]);
    let s = format!("{t}");
    assert_eq!(&s, "[ 0.1235,  1.0000, -1.2000,  4.1000,     NaN]\nTensor[[5], Double]");
    let t = Tensor::ones([50], kind::FLOAT_CPU) * 42;
    let s = format!("\n{t}");
    let expected = r#"
[42., 42., 42., 42., 42., 42., 42., 42., 42., 42., 42., 42., 42., 42., 42., 42.,
 42., 42., 42., 42., 42., 42., 42., 42., 42., 42., 42., 42., 42., 42., 42., 42.,
 42., 42., 42., 42., 42., 42., 42., 42., 42., 42., 42., 42., 42., 42., 42., 42.,
 42., 42.]
Tensor[[50], Float]"#;
    assert_eq!(&s, expected);
    let t = Tensor::ones([11000], kind::FLOAT_CPU) * 42;
    let s = format!("{t}");
    assert_eq!(&s, "[42., 42., 42., ..., 42., 42., 42.]\nTensor[[11000], Float]");
}

#[test]
fn display_multi_dim() {
    let t = Tensor::ones([200, 100], kind::FLOAT_CPU) * 42;
    let s = format!("\n{t}");
    let expected = r#"
[[42., 42., 42., ..., 42., 42., 42.],
 [42., 42., 42., ..., 42., 42., 42.],
 [42., 42., 42., ..., 42., 42., 42.],
 ...
 [42., 42., 42., ..., 42., 42., 42.],
 [42., 42., 42., ..., 42., 42., 42.],
 [42., 42., 42., ..., 42., 42., 42.]]
Tensor[[200, 100], Float]"#;
    assert_eq!(&s, expected);
    let t = t.reshape([2, 1, 1, 100, 100]);
    let t = format!("\n{t}");
    let expected = r#"
[[[[[42., 42., 42., ..., 42., 42., 42.],
    [42., 42., 42., ..., 42., 42., 42.],
    [42., 42., 42., ..., 42., 42., 42.],
    ...
    [42., 42., 42., ..., 42., 42., 42.],
    [42., 42., 42., ..., 42., 42., 42.],
    [42., 42., 42., ..., 42., 42., 42.]]]],
 [[[[42., 42., 42., ..., 42., 42., 42.],
    [42., 42., 42., ..., 42., 42., 42.],
    [42., 42., 42., ..., 42., 42., 42.],
    ...
    [42., 42., 42., ..., 42., 42., 42.],
    [42., 42., 42., ..., 42., 42., 42.],
    [42., 42., 42., ..., 42., 42., 42.]]]]]
Tensor[[2, 1, 1, 100, 100], Float]"#;
    assert_eq!(&t, expected);
}