mod config; mod corpus; mod layout; use core::cmp::Ordering; use rayon::prelude::*; use rand::prelude::*; use rand_pcg::*; use corpus::*; use layout::*; fn main() { let corpus = Corpus::load("chained_english_bigrams_1m.txt").unwrap(); println!("{}", corpus); let starting_layout = Layout::from_verbose( " Y W F L M K P O , Q U R S N H D T E A I Z X C V J B G ' . / ", ) .unwrap(); let mut rng = Pcg64::from_entropy(); type Fun = Vec<(Layout, Evaluation, f32)>; let mut best = std::f32::INFINITY; let mut layouts: Fun = (0..10) .into_iter() .map(|i| { let layout; if i >= 0 { layout = Layout::new_random_from(&starting_layout, &mut rng); } else { layout = starting_layout; } let evl = corpus.evaluate_layout(&layout); let fitness = evl.fitness(); return (layout, evl, fitness); }) .collect(); let mut counter: u64 = 0; while counter < 10000000000000 { let new_layouts = layouts .iter() .enumerate() .map(|(i, (kbd, _, _))| { if i > 0 { Layout::new_random_from(kbd, &mut rng) } else { kbd.clone() } }) .collect::>(); new_layouts .par_iter() .map(|layout| { let evl = corpus.evaluate_layout(layout); let fitness = evl.fitness(); return (*layout, evl, fitness); }) .collect_into_vec(&mut layouts); layouts.sort_by(|(_, _, lfit), (_, _, rfit)| { if lfit < rfit { Ordering::Less } else { Ordering::Greater } }); if layouts[0].2 < best { best = layouts[0].2; println!(""); println!("================================================================================\nLayout:\n{}", layouts[0].0 ); println!("{}\n{}", layouts[0].1, layouts[0].2); } counter += 1; } }