use native_neural_network_std as nn;
mod utils {
include!("test_utils.rs");
}
#[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 fuzz_structured_random_networks() {
let mut rng = utils::XorShift32::new(0xdeadbeef);
for seed in 0..500u32 {
let mut r = utils::XorShift32::new(seed.wrapping_add(rng.next_u32()));
let layers_n = 2 + (r.next_u32() % 5) as usize;
let mut layers = Vec::with_capacity(layers_n + 1);
layers.push(1 + r.next_range_usize(16));
for _ in 0..layers_n {
layers.push(1 + r.next_range_usize(64));
}
let wcount =
nn::std::network_std::NeuralNetworkStd::expected_weights_count(&layers).unwrap_or(0);
let bcount =
nn::std::network_std::NeuralNetworkStd::expected_biases_count(&layers).unwrap_or(0);
if wcount == 0 {
continue;
}
if wcount > 5_000_000 {
continue;
}
let mut weights = vec![0f32; wcount];
let mut biases = vec![0f32; bcount];
for i in 0..wcount {
weights[i] = r.next_f32() * 2.0;
}
for i in 0..bcount {
biases[i] = r.next_f32();
}
let valid = nn::std::network_std::validate_network_parts(&layers, &weights, &biases);
let _stats = nn::std::network_std::network_stats(&layers, &weights, &biases);
if valid {
let maybe = nn::std::network_std::NeuralNetworkStd::from_parts(
layers.clone(),
weights.clone(),
biases.clone(),
);
if let Ok(net) = maybe {
assert!(nn::std::network_std::validate_network_parts(
&layers,
&net.weights,
&net.biases
));
}
}
assert!(
utils::all_finite(&weights),
"seed {} produced non-finite weight",
seed
);
assert!(
utils::all_finite(&biases),
"seed {} produced non-finite bias",
seed
);
}
}