use bench_harness::rng::Xorshift64Star;
pub const IMAGE_LEN: usize = 28 * 28;
pub const NUM_CLASSES: usize = 10;
fn class_prototype(class: usize) -> [f32; IMAGE_LEN] {
let mut proto = [0.2f32; IMAGE_LEN];
let mut rng = Xorshift64Star::new(0x9000 + class as u64);
for _ in 0..(IMAGE_LEN / 6) {
let idx = (rng.next_u64() as usize) % IMAGE_LEN;
proto[idx] = 0.6;
}
proto
}
pub fn synthetic_mnist_flat(n: usize, seed: u64) -> (Vec<f32>, Vec<i32>) {
let mut rng = Xorshift64Star::new(seed);
let mut data = Vec::with_capacity(n * IMAGE_LEN);
let mut labels = Vec::with_capacity(n);
for i in 0..n {
let class = i % NUM_CLASSES;
let proto = class_prototype(class);
for &p in proto.iter() {
let noise = rng.next_f32() * 0.25;
data.push((p + noise).clamp(0.0, 1.0));
}
labels.push(class as i32);
}
(data, labels)
}