diff options
| author | tslil clingman <tslil@posteo.de> | 2022-10-20 23:17:19 +0200 |
|---|---|---|
| committer | tslil clingman <tslil@posteo.de> | 2022-10-20 23:20:12 +0200 |
| commit | 1fa7552c3018d541b617b5ceebc6abeaba013eaa (patch) | |
| tree | 7cdc73a4057ff395694c6a72817167d02280efce /srchr/src/evaluation.rs | |
| parent | aa55ddbbf13ea8b2a259ad7a07490efe9dda57f5 (diff) | |
penalise pinky columns with too high usage
even though we don't technically know which columns they are, we do
know they will be the two lowest ultimately when the prelayout becomes
a layout
Diffstat (limited to 'srchr/src/evaluation.rs')
| -rw-r--r-- | srchr/src/evaluation.rs | 49 |
1 files changed, 31 insertions, 18 deletions
diff --git a/srchr/src/evaluation.rs b/srchr/src/evaluation.rs index 1c40b44..b412d88 100644 --- a/srchr/src/evaluation.rs +++ b/srchr/src/evaluation.rs @@ -7,6 +7,8 @@ use std::fmt; pub fn prelayout_fitness(corpus: &Corpus, layout: &Prelayout) -> f32 { let mut score: f32 = 0.0; + let mut min1: f32 = std::f32::INFINITY; + let mut min2: f32 = std::f32::INFINITY; for i in 0..6 { let keys = layout.get_standard_column(i); @@ -18,12 +20,27 @@ pub fn prelayout_fitness(corpus: &Corpus, layout: &Prelayout) -> f32 { + corpus.get_bigram_perc(k1, k3) + corpus.get_bigram_perc(k2, k3); + let col_usage = corpus.get_character_perc(k1) + + corpus.get_character_perc(k2) + + corpus.get_character_perc(k3); + + if col_usage < min2 { + if col_usage < min1 { + min2 = min1; + min1 = col_usage; + } else { + min2 = col_usage; + } + } + score += (corpus.get_skipgram_perc(k1, k2) + corpus.get_skipgram_perc(k1, k3) + corpus.get_skipgram_perc(k2, k3)) * STANDARD_DSFB_WEIGHT; } + score += pinky_col_penalty(min1, min2); + for i in 0..2 { let keys = layout.get_index_column(i); let k1 = keys[0]; @@ -33,8 +50,8 @@ pub fn prelayout_fitness(corpus: &Corpus, layout: &Prelayout) -> f32 { let k5 = keys[4]; let k6 = keys[5]; - let index_percs = keys.iter().map(|&k| corpus.get_character_count(k)).sum(); - score += index_usage_fitness(corpus.get_total_count(), index_percs); + let index_percs = keys.iter().map(|&k| corpus.get_character_perc(k)).sum(); + score += index_usage_fitness(index_percs); score += corpus.get_bigram_perc(k1, k2) + corpus.get_bigram_perc(k1, k3) @@ -74,8 +91,7 @@ pub fn prelayout_fitness(corpus: &Corpus, layout: &Prelayout) -> f32 { } pub struct Evaluation { - keypress: [u32; NUM_KEYS], - total_keypress: u32, + keypress_perc: [f32; NUM_KEYS], total_bigrams: u32, sfb: [f32; 8], dsfb: [f32; 8], @@ -83,12 +99,12 @@ pub struct Evaluation { impl Evaluation { pub fn evaluate_layout(corpus: &Corpus, layout: &Layout) -> Evaluation { - let mut keypress: [u32; NUM_KEYS] = [0; NUM_KEYS]; + 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]; for (i, &c) in layout.get_keys().iter().enumerate() { - keypress[i] = corpus.get_character_count(c as u8); + keypress_perc[i] = corpus.get_character_perc(c as u8); } for i in 0..8 { @@ -166,8 +182,7 @@ impl Evaluation { } return Evaluation { - keypress, - total_keypress: corpus.get_total_count(), + keypress_perc, total_bigrams: corpus.get_total_bigrams(), sfb, dsfb, @@ -176,28 +191,26 @@ impl Evaluation { fn output_eval(&self) -> String { let mut result = String::new(); - let tot = self.total_keypress as f32; let big = self.total_bigrams as f32; let tig = self.total_bigrams as f32; result += &"Percent per key:\n"; - result += &format_block_output(self.keypress.into_iter().map(|k| 100.0 * k as f32 / tot)); + result += &format_block_output(self.keypress_perc.into_iter().map(|u| u * 100.0)); - let mut finger_usages = [0; 8]; - for (i, &c) in self.keypress.iter().enumerate() { - finger_usages[KEY_TO_FINGER[i]] += c; + let mut finger_percs = [0.0; 8]; + for (i, &c) in self.keypress_perc.iter().enumerate() { + finger_percs[KEY_TO_FINGER[i]] += c; } result += "\nFinger usage: "; let mut lh: f32 = 0.0; let mut rh: f32 = 0.0; - for (i, &u) in finger_usages.iter().enumerate() { - let f = u as f32 / tot * 100.0; - result += &format!("{:>5.2}%{}", f, if i < 7 { ", " } else { "" }); + for (i, &u) in finger_percs.iter().enumerate() { + result += &format!("{:>5.2}%{}", u * 100.0, if i < 7 { ", " } else { "" }); if i % 10 < 4 { - lh += f; + lh += u; } else { - rh += f; + rh += u; } } |
