From 5f3c2fbd14dd1dc3fd78df31c8150ee5ec2bdc64 Mon Sep 17 00:00:00 2001 From: tslil clingman Date: Sat, 22 Oct 2022 16:34:58 +0200 Subject: add lsb calculation (cannot optimised for with prelayouts) --- srchr/src/config.rs | 31 ++++++++----------------------- srchr/src/corpus.rs | 2 -- srchr/src/evaluation.rs | 27 ++++++++++++++++++++++++++- srchr/src/main.rs | 6 +++--- 4 files changed, 37 insertions(+), 29 deletions(-) (limited to 'srchr/src') diff --git a/srchr/src/config.rs b/srchr/src/config.rs index 8badd52..60cd80c 100644 --- a/srchr/src/config.rs +++ b/srchr/src/config.rs @@ -1,19 +1,3 @@ -// With the below parameters and the supplied corpus searches seem to converge on a few layouts, with one of the better ones being -// V L O M Z P F U H , -// S R A T K Y C E N I -// X J / D Q G W ' B . -// Percent per key: -// 0.92 3.96 7.42 2.57 0.06 1.62 2.10 2.77 5.94 1.78 -// 6.03 5.56 7.74 8.60 0.77 1.99 2.35 11.90 6.62 6.68 -// 0.15 0.15 0.14 4.25 0.10 1.93 2.27 1.00 1.50 1.14 -// -// Finger usage: 7.10%, 9.66%, 15.30%, 16.36%, 12.25%, 15.67%, 14.06%, 9.61% -// Hand usage: 48.42% vs 51.58% -// SFB distribution : 0.002%, 0.088%, 0.089%, 0.047%, 0.104%, 0.197%, 0.044%, 0.024% -// DSFB distribution: 0.166%, 0.402%, 0.614%, 1.302%, 0.761%, 0.985%, 1.101%, 0.405% -// Total sfb: 0.595% (50086) -// Total dsfb: 5.736% (482638) - // ----------------------------------------------------------------------------- // Tweak // ----------------------------------------------------------------------------- @@ -32,21 +16,22 @@ U V W X Y Z . , / ' // Tournament parameters pub const NUM_CONTESTANTS: usize = 256; pub const NUM_PERSIST: usize = 8; -pub const MAX_NUM_TRANSPOSITIONS: usize = 12; +pub const MAX_NUM_TRANSPOSITIONS: usize = 15; // Fitness parameters -pub const DESIRED_INDEX_USAGE_PERCENT: f32 = 0.12; -pub const MAX_PINKY_USAGE_PERCENT: f32 = 0.09; -pub const STANDARD_DSFB_WEIGHT: f32 = 1.0 / 8.0; -pub const INDEX_DSFB_WEIGHT: f32 = 1.0 / 8.0; +pub const STANDARD_DSFB_WEIGHT: f32 = 1.0 / 3.0; +pub const INDEX_DSFB_WEIGHT: f32 = 1.0 / 3.0; + +pub const MIN_INDEX_USAGE_PERCENT: f32 = 0.10; pub fn index_usage_fitness(index_perc: f32) -> f32 { - if index_perc < DESIRED_INDEX_USAGE_PERCENT { - DESIRED_INDEX_USAGE_PERCENT - index_perc + if index_perc < MIN_INDEX_USAGE_PERCENT { + MIN_INDEX_USAGE_PERCENT - index_perc } else { 0.0 } } +pub const MAX_PINKY_USAGE_PERCENT: f32 = 0.085; pub fn pinky_col_penalty(lesser_perc: f32, greater_perc: f32) -> f32 { if greater_perc > MAX_PINKY_USAGE_PERCENT { if lesser_perc > MAX_PINKY_USAGE_PERCENT { diff --git a/srchr/src/corpus.rs b/srchr/src/corpus.rs index 102aabd..846f611 100644 --- a/srchr/src/corpus.rs +++ b/srchr/src/corpus.rs @@ -89,8 +89,6 @@ impl Corpus { } } - println!("Chars: {:?}\nBigs:{:?}", character_percs, bigram_percs); - return Ok(Corpus { skipgram_percs, bigram_percs, diff --git a/srchr/src/evaluation.rs b/srchr/src/evaluation.rs index 3d171b0..6621700 100644 --- a/srchr/src/evaluation.rs +++ b/srchr/src/evaluation.rs @@ -94,6 +94,7 @@ pub struct Evaluation { keypress_perc: [f32; NUM_KEYS], sfb: [f32; 8], dsfb: [f32; 8], + lsb: f32, } impl Evaluation { @@ -101,6 +102,7 @@ impl Evaluation { let mut keypress_perc: [f32; NUM_KEYS] = [0.0; NUM_KEYS]; let mut sfb: [f32; 8] = [0.0; 8]; let mut dsfb: [f32; 8] = [0.0; 8]; + let mut lsb = 0.0; for (i, &c) in layout.get_keys().iter().enumerate() { keypress_perc[i] = corpus.get_character_perc(c as u8); @@ -180,10 +182,32 @@ impl Evaluation { } } + // LSB for index-middle only + for left in [true, false] { + let mind = if left { 2 } else { 7 }; + let iind = if left { 4 } else { 5 }; + let m1 = layout.get_key(mind + 10 * 0); + let m2 = layout.get_key(mind + 10 * 1); + let m3 = layout.get_key(mind + 10 * 2); + let i1 = layout.get_key(iind + 10 * 0); + let i2 = layout.get_key(iind + 10 * 1); + let i3 = layout.get_key(iind + 10 * 2); + lsb += corpus.get_bigram_perc(m1, i1) + + corpus.get_bigram_perc(m1, i2) + + corpus.get_bigram_perc(m1, i3) + + corpus.get_bigram_perc(m2, i1) + + corpus.get_bigram_perc(m2, i2) + + corpus.get_bigram_perc(m2, i3) + + corpus.get_bigram_perc(m3, i1) + + corpus.get_bigram_perc(m3, i2) + + corpus.get_bigram_perc(m3, i3); + } + return Evaluation { keypress_perc, sfb, dsfb, + lsb, }; } @@ -210,7 +234,7 @@ impl Evaluation { } } - result += &format!("\nHand usage: {:.2}% vs {:.2}%", lh, rh); + result += &format!("\nHand usage: {:.2}% vs {:.2}%", lh * 100.0, rh * 100.0); result += "\nSFB distribution : "; for (i, &u) in self.sfb.iter().enumerate() { @@ -226,6 +250,7 @@ impl Evaluation { let dsfb = self.dsfb.iter().sum::(); result += &format!("\nTotal sfb: {:.3}%", sfb * 100.0); result += &format!("\nTotal dsfb: {:.3}%", dsfb * 100.0); + result += &format!("\nTotal lsb: {:.3}%", self.lsb * 100.0); return result; } diff --git a/srchr/src/main.rs b/srchr/src/main.rs index b4a26f9..628dbdb 100644 --- a/srchr/src/main.rs +++ b/srchr/src/main.rs @@ -67,7 +67,7 @@ impl<'a> Tournament<'a> { }); let result; - if tournament[0].1 + 0.00001 < best { + if tournament[0].1 + 1e-7 < best { result = Some(tournament[0].0); } else { result = None; @@ -92,10 +92,10 @@ fn main() { let seed_layout = Layout::from_verbose(STARTING_LAYOUT_STRING).unwrap(); let seed_evl = Evaluation::evaluate_layout(&corpus, &seed_layout); - println!("Starting with\n {}{}", seed_layout, seed_evl); - let seed_prelayout = seed_layout.as_prelayout(); + println!("Starting with\n{}{}", seed_layout, seed_evl); + let mut tournament = Tournament::new_from_seed_prelayout(&seed_prelayout, &corpus); let mut count: usize = 0; -- cgit v1.3.1