native_neural_network_std 0.2.1

Ergonomic std wrapper for the `native_neural_network` crate (no_std) — std-friendly re-exports and utilities.
Documentation
use native_neural_network_std::std::activations_std::ActivationKind;
use native_neural_network_std::std::layers_std::{DenseLayerDesc, LayerSpec};
use native_neural_network_std::std::model_format_std::{
    decode_model_v1, encode_model_v1, encoded_size_v1,
};

#[test]
fn cpu_backend_abstraction_real() {
    let previous = native_neural_network_std::std::engine_std::get_compute_backend();
    native_neural_network_std::std::engine_std::set_compute_backend(
        native_neural_network_std::std::engine_std::ComputeBackend::Cpu,
    );
    assert_eq!(
        native_neural_network_std::std::engine_std::get_compute_backend(),
        native_neural_network_std::std::engine_std::ComputeBackend::Cpu
    );
    native_neural_network_std::std::engine_std::set_compute_backend(previous);
}

#[test]
fn encode_decode_roundtrip() {
    let layers = vec![LayerSpec::Dense(DenseLayerDesc {
        input_size: 1,
        output_size: 1,
        weight_offset: 0,
        bias_offset: 0,
        activation: ActivationKind::Identity,
    })];
    let weights = vec![2.5f32];
    let biases = vec![0.5f32];

    let size = encoded_size_v1(layers.len(), weights.len(), biases.len())
        .expect("encoded_size should be available");
    let mut buf = vec![0u8; size];

    let encoded =
        encode_model_v1(&layers, &weights, &biases, &mut buf).expect("encode should succeed");
    assert!(encoded > 0);

    let mut layers_out = vec![
        LayerSpec::Dense(DenseLayerDesc {
            input_size: 0,
            output_size: 0,
            weight_offset: 0,
            bias_offset: 0,
            activation: ActivationKind::Identity
        });
        1
    ];
    let mut weights_out = vec![0f32; weights.len()];
    let mut biases_out = vec![0f32; biases.len()];

    let decoded = decode_model_v1(
        &buf[..encoded],
        &mut layers_out,
        &mut weights_out,
        &mut biases_out,
    )
    .expect("decode should succeed");

    assert_eq!(decoded.layers, 1);
    assert_eq!(weights_out, weights);
    assert_eq!(biases_out, biases);
}

#[test]
fn decode_truncated_returns_err() {
    use native_neural_network_std::std::activations_std::ActivationKind as Act;
    let mut out_layers = vec![
        LayerSpec::Dense(DenseLayerDesc {
            input_size: 0,
            output_size: 0,
            weight_offset: 0,
            bias_offset: 0,
            activation: Act::Identity
        });
        1
    ];
    let mut weights_out = vec![0f32; 1];
    let mut biases_out = vec![0f32; 1];
    let res = decode_model_v1(
        &[0u8; 3],
        &mut out_layers,
        &mut weights_out,
        &mut biases_out,
    );
    assert!(res.is_err());
}

#[test]
fn encoded_size_matches_actual_used_length() {
    let layers = vec![LayerSpec::Dense(DenseLayerDesc {
        input_size: 2,
        output_size: 2,
        weight_offset: 0,
        bias_offset: 0,
        activation: ActivationKind::Identity,
    })];
    let weights = vec![0.1f32, 0.2f32, 0.3f32, 0.4f32];
    let biases = vec![0.0f32, 0.0f32];
    let size = encoded_size_v1(layers.len(), weights.len(), biases.len())
        .expect("encoded_size should be available");
    let mut buf = vec![0u8; size + 8];
    let used =
        encode_model_v1(&layers, &weights, &biases, &mut buf).expect("encode should succeed");
    assert!(used <= size + 8);
    assert_eq!(
        used,
        encoded_size_v1(layers.len(), weights.len(), biases.len()).unwrap()
    );
}