tenferro-ad 0.3.0

Eager runtime, eager tensors, and traced AD extension traits for tenferro.
use tenferro_runtime::{GraphCompiler, Tensor, TracedTensor};

use crate::support::{cpu_runtime, run_compiled_one};

#[test]
fn traced_tensor_col_major_constructor_preserves_shape_and_storage() {
    let traced =
        TracedTensor::from_vec_col_major([2, 3], vec![1.0_f64, 4.0, 2.0, 5.0, 3.0, 6.0]).unwrap();
    assert_eq!(traced.dtype(), tenferro_runtime::DType::F64);

    let mut compiler = GraphCompiler::new();
    let program = compiler.compile(&traced).unwrap();
    assert_eq!(program.input_count(), 1);
    assert_eq!(program.bindings().iter().next().unwrap().1.shape(), &[2, 3]);
    let out = run_compiled_one(&cpu_runtime(), &program, &[]).unwrap();
    assert_eq!(
        out.as_slice::<f64>().unwrap(),
        &[1.0, 4.0, 2.0, 5.0, 3.0, 6.0],
    );
}

#[test]
fn traced_tensor_col_major_constructor_keeps_physical_order() {
    let traced = TracedTensor::from_vec_col_major(vec![2, 2], vec![1_i64, 3, 2, 4]).unwrap();

    let mut compiler = GraphCompiler::new();
    let program = compiler.compile(&traced).unwrap();
    let out = run_compiled_one(&cpu_runtime(), &program, &[]).unwrap();
    assert_eq!(
        out.into_vec_col_major::<i64>().unwrap(),
        (vec![2, 2], vec![1, 3, 2, 4]),
    );
}

#[test]
fn tensor_col_major_constructor_is_the_facade_import_path() {
    let tensor = Tensor::from_vec_col_major([2, 2], vec![1.0_f64, 3.0, 2.0, 4.0]).unwrap();
    assert_eq!(tensor.as_slice::<f64>().unwrap(), &[1.0, 3.0, 2.0, 4.0]);
}