aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortslil clingman <tslil@posteo.de>2022-09-25 17:27:50 +0200
committertslil clingman <tslil@posteo.de>2022-09-25 17:27:50 +0200
commitac5858eb9f241023224b5415b1f6d516aae514b8 (patch)
tree721e4ce98e4065106c3d46786ca3949127ac7553 /src
parent1cac34b7ea939e0d0d1157de59e90c70b2831812 (diff)
Focus on sfb
Diffstat (limited to 'src')
-rw-r--r--src/corpus.rs52
-rw-r--r--src/layout.rs48
-rw-r--r--src/main.rs37
3 files changed, 88 insertions, 49 deletions
diff --git a/src/corpus.rs b/src/corpus.rs
index 20ddbb3..2fab5a4 100644
--- a/src/corpus.rs
+++ b/src/corpus.rs
@@ -51,6 +51,58 @@ impl Corpus {
});
}
+ pub fn layout_fitness(&self, layout: &Layout) -> u32 {
+ let mut sfb: u32 = 0;
+
+ // TODO: We make assumptions about NUM_KEYS here
+ for i in 0..8 {
+ let ind = if i < 4 { i } else { i + 2 };
+
+ let k1 = layout.get_key(ind + 10 * 0);
+ let k2 = layout.get_key(ind + 10 * 1);
+ let k3 = layout.get_key(ind + 10 * 2);
+
+ sfb += self.bigram_count[pair_to_index(k1, k2)]
+ + self.bigram_count[pair_to_index(k1, k3)]
+ + self.bigram_count[pair_to_index(k2, k3)];
+
+ if i == 3 {
+ let k4 = layout.get_key(4 + 10 * 0);
+ let k5 = layout.get_key(4 + 10 * 1);
+ let k6 = layout.get_key(4 + 10 * 2);
+ sfb += self.bigram_count[pair_to_index(k4, k5)]
+ + self.bigram_count[pair_to_index(k4, k6)]
+ + self.bigram_count[pair_to_index(k5, k6)]
+ + self.bigram_count[pair_to_index(k1, k4)]
+ + self.bigram_count[pair_to_index(k1, k5)]
+ + self.bigram_count[pair_to_index(k1, k6)]
+ + self.bigram_count[pair_to_index(k2, k4)]
+ + self.bigram_count[pair_to_index(k2, k5)]
+ + self.bigram_count[pair_to_index(k2, k6)]
+ + self.bigram_count[pair_to_index(k3, k4)]
+ + self.bigram_count[pair_to_index(k3, k5)]
+ + self.bigram_count[pair_to_index(k3, k6)];
+ } else if i == 4 {
+ let k4 = layout.get_key(5 + 10 * 0);
+ let k5 = layout.get_key(5 + 10 * 1);
+ let k6 = layout.get_key(5 + 10 * 2);
+ sfb += self.bigram_count[pair_to_index(k4, k5)]
+ + self.bigram_count[pair_to_index(k5, k6)]
+ + self.bigram_count[pair_to_index(k4, k6)]
+ + self.bigram_count[pair_to_index(k1, k4)]
+ + self.bigram_count[pair_to_index(k1, k5)]
+ + self.bigram_count[pair_to_index(k1, k6)]
+ + self.bigram_count[pair_to_index(k2, k4)]
+ + self.bigram_count[pair_to_index(k2, k5)]
+ + self.bigram_count[pair_to_index(k2, k6)]
+ + self.bigram_count[pair_to_index(k3, k4)]
+ + self.bigram_count[pair_to_index(k3, k5)]
+ + self.bigram_count[pair_to_index(k3, k6)];
+ }
+ }
+ sfb
+ }
+
pub fn evaluate_layout(&self, layout: &Layout) -> Evaluation {
let mut keypress: [u32; NUM_KEYS] = [0; NUM_KEYS];
let mut sfb: [u32; 8] = [0; 8];
diff --git a/src/layout.rs b/src/layout.rs
index 0ce3fdc..0ebad27 100644
--- a/src/layout.rs
+++ b/src/layout.rs
@@ -129,30 +129,30 @@ impl Evaluation {
}
// TODO
- pub fn fitness(&self) -> f32 {
- // let mut finger_usages = [0; 8];
- // let tot = self.total_keypress as f32;
- // for (i, &c) in self.keypress.iter().enumerate() {
- // finger_usages[KEY_TO_FINGER[i]] += c;
- // }
- // const MAX_FINGER_USAGES: [f32; 8] = [8.0, 11.0, 21.0, 21.0, 21.0, 21.0, 11.0, 8.0];
- // const MAX_FINGER_USAGES: [f32; 8] =
- // [100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0];
- // if finger_usages
- // .iter()
- // .enumerate()
- // .any(|(i, &c)| c as f32 / tot * 100.00 > MAX_FINGER_USAGES[i])
- // {
- // std::u32::MAX
- // } else {
- // self.sfb
- // .iter()
- // .enumerate()
- // .map(|(i, &s)| s as f32 / finger_usages[i] as f32 * 50.0)
- // .sum()
- // }
- self.sfb.iter().sum::<u32>() as f32
- }
+ // pub fn fitness(&self) -> f32 {
+ // let mut finger_usages = [0; 8];
+ // let tot = self.total_keypress as f32;
+ // for (i, &c) in self.keypress.iter().enumerate() {
+ // finger_usages[KEY_TO_FINGER[i]] += c;
+ // }
+ // const MAX_FINGER_USAGES: [f32; 8] = [8.0, 11.0, 21.0, 21.0, 21.0, 21.0, 11.0, 8.0];
+ // const MAX_FINGER_USAGES: [f32; 8] =
+ // [100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0];
+ // if finger_usages
+ // .iter()
+ // .enumerate()
+ // .any(|(i, &c)| c as f32 / tot * 100.00 > MAX_FINGER_USAGES[i])
+ // {
+ // std::u32::MAX
+ // } else {
+ // self.sfb
+ // .iter()
+ // .enumerate()
+ // .map(|(i, &s)| s as f32 / finger_usages[i] as f32 * 50.0)
+ // .sum()
+ // }
+ // self.sfb.iter().sum::<u32>() as f32
+ // }
}
impl fmt::Display for Evaluation {
diff --git a/src/main.rs b/src/main.rs
index 462d2fe..905d3c6 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -2,7 +2,6 @@ mod config;
mod corpus;
mod layout;
-use core::cmp::Ordering;
use rayon::prelude::*;
use rand::prelude::*;
@@ -12,7 +11,7 @@ use corpus::*;
use layout::*;
fn main() {
- let corpus = Corpus::load("chained_english_bigrams_1m.txt").unwrap();
+ let corpus = Corpus::load("new.txt").unwrap();
println!("{}", corpus);
let starting_layout = Layout::from_verbose(
@@ -26,9 +25,9 @@ fn main() {
let mut rng = Pcg64::from_entropy();
- type Fun = Vec<(Layout, Evaluation, f32)>;
+ type Fun = Vec<(Layout, u32)>;
- let mut best = std::f32::INFINITY;
+ let mut best = std::u32::MAX;
let mut layouts: Fun = (0..10)
.into_iter()
.map(|i| {
@@ -39,18 +38,15 @@ fn main() {
layout = starting_layout;
}
- let evl = corpus.evaluate_layout(&layout);
- let fitness = evl.fitness();
- return (layout, evl, fitness);
+ return (layout, corpus.layout_fitness(&layout));
})
.collect();
- let mut counter: u64 = 0;
- while counter < 10000000000000 {
+ loop {
let new_layouts = layouts
.iter()
.enumerate()
- .map(|(i, (kbd, _, _))| {
+ .map(|(i, (kbd, _))| {
if i > 0 {
Layout::new_random_from(kbd, &mut rng)
} else {
@@ -62,30 +58,21 @@ fn main() {
new_layouts
.par_iter()
.map(|layout| {
- let evl = corpus.evaluate_layout(layout);
- let fitness = evl.fitness();
- return (*layout, evl, fitness);
+ return (*layout, corpus.layout_fitness(layout));
})
.collect_into_vec(&mut layouts);
- layouts.sort_by(|(_, _, lfit), (_, _, rfit)| {
- if lfit < rfit {
- Ordering::Less
- } else {
- Ordering::Greater
- }
- });
+ layouts.sort_by(|(_, lfit), (_, rfit)| lfit.cmp(rfit));
- if layouts[0].2 < best {
- best = layouts[0].2;
+ if layouts[0].1 < best {
+ best = layouts[0].1;
+ let evl = corpus.evaluate_layout(&layouts[0].0);
println!("");
println!("================================================================================\nLayout:\n{}",
layouts[0].0
);
- println!("{}\n{}", layouts[0].1, layouts[0].2);
+ println!("{}\n{}", evl, layouts[0].1);
}
-
- counter += 1;
}
}