mod netcrate_test {
use crate as const_cge;
use const_cge::*;
mod netcrate_example {
use crate as const_cge;
const_cge::netcrate!(testnet = "./test_inputs/test_net.cge");
}
mod netcrate_example_2 {
use crate as const_cge;
const_cge::netcrate!(testnet2 = "./test_inputs/test_net.cge");
}
#[test]
fn recurrency() {
#[recurrent(testnet)]
struct MyNet {}
}
#[test] fn nonrecurrency() {
}
}
mod custom_recurrency_tests {
use crate as const_cge;
use const_cge::*;
#[test]
fn recurrent_previous_value() {
#[recurrent("./test_inputs/recurrent_previous_value.cge", numeric_type = f64)]
struct TestNet;
let mut net = TestNet::default();
for (input, correct) in [([], [1.0]), ([], [4.0])] {
let mut static_outputs = [0.0; 1];
net.evaluate(&input, &mut static_outputs);
assert_eq!(static_outputs, correct);
}
}
}
mod test_net {
use crate as const_cge;
use const_cge::*;
use cge::*;
use proptest::{
prelude::*,
collection::vec,
array::uniform2
};
#[test]
fn recurrent_memorywipe_50k_trials() {
#[network("./test_inputs/test_net.cge", numeric_type = f64)]
struct TestNet;
let runtime = Network::load_from_file("./test_inputs/test_net.cge")
.expect("Failed to dynamically load CGE file");
proptest!(ProptestConfig::with_cases(50_000), |(input_vector in uniform2(-1.0f64..1.0f64))| {
let mut net = TestNet::default();
let mut runtime = runtime.clone();
let static_outputs = {
let mut outputs = [0.0; 1];
net.evaluate(&input_vector, &mut outputs);
outputs.to_vec()
};
let runtime_outputs = runtime.evaluate(&input_vector[..]);
assert_eq!(static_outputs, runtime_outputs);
});
}
#[test]
fn recurrent_5k_cycles_1k_trials() {
#[recurrent("./test_inputs/test_net.cge", numeric_type = f64)]
struct TestNet;
let runtime = Network::load_from_file("./test_inputs/test_net.cge")
.expect("Failed to dynamically load CGE file");
proptest!(ProptestConfig::with_cases(50), |(input_vectors in vec(uniform2(-1.0f64..1.0f64), 5000..=5000))| {
let mut net = TestNet::default(); let mut runtime = runtime.clone();
for input_vector in input_vectors {
let static_outputs = {
let mut outputs = [0.0; 1];
net.evaluate(&input_vector, &mut outputs);
outputs.to_vec()
};
let runtime_outputs = runtime.evaluate(&input_vector[..]);
assert_eq!(static_outputs, runtime_outputs);
}
});
}
}
mod figure_5_3_paper {
use crate as const_cge;
use const_cge::*;
use cge::*;
use proptest::{
prelude::*,
collection::vec,
array::uniform2
};
#[test]
fn recurrent_memorywipe_50k_trials() {
#[network("./test_inputs/fig_5_3_paper.cge", numeric_type = f64)]
struct FigureNet;
let runtime = Network::load_from_file("./test_inputs/fig_5_3_paper.cge")
.expect("Failed to dynamically load CGE file");
proptest!(ProptestConfig::with_cases(50_000), |(input_vector in uniform2(-1.0f64..1.0f64))| {
let mut net = FigureNet::default();
let mut runtime = runtime.clone();
let static_outputs = {
let mut outputs = [0.0; FigureNet::OUTPUT_COUNT];
net.evaluate(&input_vector, &mut outputs);
outputs.to_vec()
};
let runtime_outputs = runtime.evaluate(&input_vector[..]);
assert_eq!(static_outputs, runtime_outputs);
});
}
#[test]
fn recurrent_5k_cycles_1k_trials() {
#[recurrent("./test_inputs/fig_5_3_paper.cge", numeric_type = f64)]
struct TestNet;
let runtime = Network::load_from_file("./test_inputs/fig_5_3_paper.cge")
.expect("Failed to dynamically load CGE file");
proptest!(ProptestConfig::with_cases(50), |(input_vectors in vec(uniform2(-1.0f64..1.0f64), 5000..=5000))| {
let mut net = TestNet::default(); let mut runtime = runtime.clone();
for input_vector in input_vectors {
let static_outputs = {
let mut outputs = [0.0; 1];
net.evaluate(&input_vector, &mut outputs);
outputs.to_vec()
};
let runtime_outputs = runtime.evaluate(&input_vector[..]);
assert_eq!(static_outputs, runtime_outputs);
}
});
}
}
mod figure_5_3_paper_plus_one {
use crate as const_cge;
use const_cge::*;
use cge::*;
use proptest::{
prelude::*,
collection::vec,
array::uniform2
};
#[test]
fn recurrent_memorywipe_50k_trials() {
#[recurrent("./test_inputs/fig_5_3_paper_plus_one.cge", numeric_type = f64)]
struct TestNet;
let runtime = Network::load_from_file("./test_inputs/fig_5_3_paper_plus_one.cge")
.expect("Failed to dynamically load CGE file");
proptest!(ProptestConfig::with_cases(50_000), |(input_vector in uniform2(-1.0f64..1.0f64))| {
let mut net = TestNet::default();
let mut runtime = runtime.clone();
let static_outputs = {
let mut outputs = [0.0; 1];
net.evaluate(&input_vector, &mut outputs);
outputs.to_vec()
};
let runtime_outputs = runtime.evaluate(&input_vector[..]);
assert_eq!(static_outputs, runtime_outputs);
});
}
#[test]
fn recurrent_5k_cycles_1k_trials() {
#[recurrent("./test_inputs/fig_5_3_paper_plus_one.cge", numeric_type = f64)]
struct TestNet;
let runtime = Network::load_from_file("./test_inputs/fig_5_3_paper_plus_one.cge")
.expect("Failed to dynamically load CGE file");
proptest!(ProptestConfig::with_cases(50), |(input_vectors in vec(uniform2(-1.0f64..1.0f64), 5000..=5000))| {
let mut net = TestNet::default(); let mut runtime = runtime.clone();
for input_vector in input_vectors {
let static_outputs = {
let mut outputs = [0.0; 1];
net.evaluate(&input_vector, &mut outputs);
outputs.to_vec()
};
let runtime_outputs = runtime.evaluate(&input_vector[..]);
assert_eq!(static_outputs, runtime_outputs);
}
});
}
}