aboutsummaryrefslogtreecommitdiff
path: root/srchr/src
diff options
context:
space:
mode:
Diffstat (limited to 'srchr/src')
-rw-r--r--srchr/src/config.rs31
-rw-r--r--srchr/src/corpus.rs2
-rw-r--r--srchr/src/evaluation.rs27
-rw-r--r--srchr/src/main.rs6
4 files changed, 37 insertions, 29 deletions
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::<f32>();
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;