modelc 0.1.1

Compile model weight files to standalone executable binaries
Documentation
use modelc::runtime::tensor::Tensor;

#[test]
fn test_tensor_zeros() {
    let t = Tensor::zeros(vec![3, 4]);
    assert_eq!(t.shape, vec![3, 4]);
    assert_eq!(t.data.len(), 12);
    assert!(t.data.iter().all(|&x| x == 0.0));
}

#[test]
fn test_tensor_zeros_1d() {
    let t = Tensor::zeros(vec![5]);
    assert_eq!(t.shape, vec![5]);
    assert_eq!(t.data.len(), 5);
}

#[test]
fn test_tensor_zeros_scalar() {
    let t = Tensor::zeros(vec![1]);
    assert_eq!(t.shape, vec![1]);
    assert_eq!(t.data.len(), 1);
}

#[test]
fn test_tensor_from_vec() {
    let t = Tensor::from_vec(vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0], vec![2, 3]);
    assert_eq!(t.shape, vec![2, 3]);
    assert_eq!(t.data, vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0]);
}

#[test]
fn test_tensor_len() {
    let t = Tensor::from_vec(vec![1.0, 2.0, 3.0], vec![3]);
    assert_eq!(t.len(), 3);
}

#[test]
fn test_tensor_is_empty() {
    let t = Tensor::from_vec(vec![], vec![0]);
    assert!(t.is_empty());
    let t2 = Tensor::from_vec(vec![1.0], vec![1]);
    assert!(!t2.is_empty());
}

#[test]
fn test_tensor_reshape_same_size() {
    let t = Tensor::from_vec(vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0], vec![2, 3]);
    let r = t.reshape(vec![3, 2]);
    assert_eq!(r.shape, vec![3, 2]);
    assert_eq!(r.data, vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0]);
}

#[test]
fn test_tensor_reshape_1d() {
    let t = Tensor::from_vec(vec![1.0, 2.0, 3.0, 4.0], vec![2, 2]);
    let r = t.reshape(vec![4]);
    assert_eq!(r.shape, vec![4]);
}

#[test]
#[should_panic]
fn test_tensor_reshape_mismatch() {
    let t = Tensor::from_vec(vec![1.0, 2.0, 3.0], vec![3]);
    t.reshape(vec![2, 2]);
}

#[test]
fn test_tensor_preserves_data() {
    let data = vec![42.0, -1.5, 0.0, 100.0, f32::MAX, f32::MIN];
    let t = Tensor::from_vec(data.clone(), vec![2, 3]);
    assert_eq!(t.data, data);
}