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()
);
}