Skip to content

Commit ec6cf86

Browse files
committed
added SFS
1 parent 779217f commit ec6cf86

2 files changed

Lines changed: 67 additions & 48 deletions

File tree

optimiser.js

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,14 @@ var error_text = "";
2020
var m_score = 0;
2121

2222
var sfb_data = {label: "SFB:", metric: 0, score: 0, weight: 3, min: 0.39, desc: "Single finger bigrams"}
23-
var effort_data = {label: "Effort:", metric: 0, score: 0, weight: 7, min: 0, desc: "Effort based on defined matrix"}
23+
var effort_data = {label: "Effort:", metric: 0, score: 0, weight: 3, min: 0, desc: "Effort based on defined matrix"}
2424
var psfb_data = {label: "pSFB:", metric: 0, score: 0, weight: 0.7, min: 0, desc: "Additional penalty for SFBs on the pinky"}
2525
var rsfb_data = {label: "rSFB:", metric: 0, score: 0, weight: 0.3, min: 0, desc: "Additional penalty for SFBs on the ring finger"}
2626
var scissors_data = {label: "Scissors:", metric: 0, score: 0, weight: 1, min: 0, desc: "Two letters on the same hand, two rows between them, on adjacent fingers"}
2727
var prscissors_data = {label: "PRScissor:", metric: 0, score: 0, weight: 0.9, min: 0.2, desc: "Two letters typed with the ring and pinky with at least one row between them"}
2828
var wscissors_data = {label: "WScissors:", metric: 0, score: 0, weight: 1, min: 0, desc: "Two letters on the same hand, two rows between them, more than one column between them" }
2929
var latstr_data = {label: "LSB:", metric: 0, score: 0, weight: 1, min: 0.12, desc: "Lateral stretch bigrams"}
30+
var sfs_data = {label: "SFS:", metric: 0, score: 0, weight: 0.8, min: 0, desc: "Single finger skipgrams"}
3031
var vowels_data = {label: "Vowels:", metric: 0, score: 0, weight: 3, min: 0, desc: "Should vowels be on the same side"}
3132
var hbalance_data = {label: "Hand Bal:", metric: 0, score: 0, weight: 0.7, min: 1, desc: "Hand balance, how much different from 50/50 usage" }
3233

@@ -134,6 +135,12 @@ function getCharacters() {
134135
bigram_count += 1
135136
}
136137
console.log("there are "+bigram_count+ " bigrams")
138+
139+
for(var tmp in trigram_freq) {
140+
if (trigram_freq[tmp] <= 30){
141+
Reflect.deleteProperty(trigram_freq, tmp)
142+
}
143+
}
137144
var trigram_count = 0
138145
for(var tmp in trigram_freq) {
139146
trigram_count += 1
@@ -502,6 +509,8 @@ function generateStats() {
502509
y += 35
503510
addStatLine(x,y,latstr_data)
504511
y += 35
512+
addStatLine(x,y,sfs_data)
513+
y += 35
505514
addStatLine(x,y,vowels_data)
506515
y += 35
507516
addStatLine(x,y,hbalance_data)
@@ -984,7 +993,7 @@ function run() {
984993
myWorker.postMessage({
985994
letter_freq: letter_freq,
986995
bigrams: bigram_freq,
987-
// trigrams: trigram_freq,
996+
trigrams: trigram_freq,
988997
config: tmp_keys,
989998
});
990999
}
@@ -1015,7 +1024,7 @@ function run() {
10151024
myWorker.postMessage({
10161025
letter_freq: letter_freq,
10171026
bigrams: bigram_freq,
1018-
// trigrams: trigram_freq,
1027+
trigrams: trigram_freq,
10191028
config: tmp_keys,
10201029
});
10211030
}
@@ -1037,6 +1046,7 @@ function run() {
10371046
prscissors_data.metric = (100*result.prscissors / input_length).toFixed(2) + "%"
10381047
wscissors_data.metric = (100*result.wide_scissors / input_length).toFixed(2) + "%"
10391048
latstr_data.metric = (100*result.lat_str / input_length).toFixed(2) + "%"
1049+
sfs_data.metric = (100*result.sfs / input_length).toFixed(2) + "%"
10401050
vowels_data.metric = (result.vowels)
10411051
hbalance_data.metric = (result.hand_balance).toFixed(2)
10421052

@@ -1048,11 +1058,11 @@ function run() {
10481058
prscissors_data.score = calculateScore(result.prscissors, prscissors_data.weight, prscissors_data.min, input_length, true)
10491059
wscissors_data.score = calculateScore(result.wide_scissors, wscissors_data.weight, wscissors_data.min, input_length, true)
10501060
latstr_data.score = calculateScore(result.lat_str, latstr_data.weight, latstr_data.min, input_length, true)
1061+
sfs_data.score = calculateScore(result.sfs, sfs_data.weight, sfs_data.min, input_length, true)
10511062
vowels_data.score = (result.vowels - vowels_data.min) * vowels_data.weight
10521063
hbalance_data.score = (result.hand_balance - hbalance_data.min) * hbalance_data.weight
10531064
if (hbalance_data.score < 0) {hbalance_data.score = 0}
10541065

1055-
10561066
score += sfb_data.score
10571067
score += effort_data.score
10581068
score += psfb_data.score
@@ -1061,6 +1071,7 @@ function run() {
10611071
score += prscissors_data.score
10621072
score += wscissors_data.score
10631073
score += latstr_data.score
1074+
score += sfs_data.score
10641075
score += vowels_data.score
10651076
score += hbalance_data.score
10661077
m_score = score
@@ -1116,6 +1127,7 @@ function run() {
11161127
prscissors_data.metric = (100*best_results[besti].result.prscissors / input_length).toFixed(2) + "%"
11171128
wscissors_data.metric = (100*best_results[besti].result.wide_scissors / input_length).toFixed(2) + "%"
11181129
latstr_data.metric = (100*best_results[besti].result.lat_str / input_length).toFixed(2) + "%"
1130+
sfs_data.metric = (100*best_results[besti].result.sfs / input_length).toFixed(2) + "%"
11191131
vowels_data.metric = (best_results[besti].result.vowels)
11201132
hbalance_data.metric = (best_results[besti].result.hand_balance).toFixed(2)
11211133

@@ -1127,6 +1139,7 @@ function run() {
11271139
prscissors_data.score = calculateScore(best_results[besti].result.prscissors, prscissors_data.weight, prscissors_data.min, input_length, true)
11281140
wscissors_data.score = calculateScore(best_results[besti].result.wide_scissors, wscissors_data.weight, wscissors_data.min, input_length, true)
11291141
latstr_data.score = calculateScore(best_results[besti].result.lat_str, latstr_data.weight, latstr_data.min, input_length, true)
1142+
sfs_data.score = calculateScore(best_results[besti].result.sfs, sfs_data.weight, sfs_data.min, input_length, true)
11301143
vowels_data.score = (best_results[besti].result.vowels - vowels_data.min) * vowels_data.weight
11311144
hbalance_data.score = (best_results[besti].result.hand_balance - hbalance_data.min) * hbalance_data.weight
11321145
if (hbalance_data.score < 0) {hbalance_data.score = 0}
@@ -1139,8 +1152,10 @@ function run() {
11391152
prscissors_data.score +
11401153
wscissors_data.score +
11411154
latstr_data.score +
1155+
sfs_data.score +
11421156
vowels_data.score +
11431157
hbalance_data.score
1158+
11441159
generateLayout();
11451160
generateStats();
11461161
}

worker.js

Lines changed: 48 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
// worker.js
22

3-
// console.log('Worker: Script loaded and ready to receive messages.');
4-
53
var lookup = {};
64

75
function makeLookup(config) {
@@ -10,11 +8,8 @@ function makeLookup(config) {
108
}
119
}
1210

13-
// function calculateMetrics(bigrams, trigrams, config){
14-
function calculateMetrics(letter_freq, bigrams, config){
11+
function calculateMetrics(letter_freq, bigrams, trigrams, config){
1512
makeLookup(config);
16-
// console.log(letter_freq)
17-
// console.log(lookup)
1813
var count = 0;
1914
var a = "";
2015
var b = "";
@@ -39,6 +34,7 @@ function calculateMetrics(letter_freq, bigrams, config){
3934
var wide_scissors = 0;
4035
var effort = 0;
4136
var sfs = 0; // eXd on qwerty where X is not in the same column as e/d - this needs trigrams
37+
var sfss = {}; // remove this. just for debugging
4238
var left_hand = 0;
4339
var right_hand = 0;
4440
var hand_balance;
@@ -163,41 +159,49 @@ function calculateMetrics(letter_freq, bigrams, config){
163159
}
164160
}
165161
}
166-
// for (var item in trigrams) {
167-
// a = item.charAt(0);
168-
// b = item.charAt(1);
169-
// c = item.charAt(1);
170-
// count = bigrams[item]
162+
for (var item in trigrams) {
163+
a = item.charAt(0);
164+
b = item.charAt(1);
165+
c = item.charAt(2);
166+
count = trigrams[item]
167+
168+
if (lookup[a]){
169+
row1 = lookup[a].row;
170+
col1 = lookup[a].col;
171+
finger1 = lookup[a].finger;
172+
effort += lookup[a].effort * count
173+
} else {
174+
// console.log("Can't find lookup info for "+a);
175+
finger1 = -1;
176+
}
177+
if (lookup[b]){
178+
row2 = lookup[b].row;
179+
col2 = lookup[b].col;
180+
finger2 = lookup[b].finger;
181+
effort += lookup[b].effort * count
182+
} else {
183+
// console.log("Can't find lookup info for "+a);
184+
finger2 = -2;
185+
}
186+
if (lookup[c]){
187+
row3 = lookup[c].row;
188+
col3 = lookup[c].col;
189+
finger3 = lookup[c].finger;
190+
effort += lookup[c].effort * count
191+
} else {
192+
// console.log("Can't find lookup info for "+a);
193+
finger3 = -3;
194+
}
195+
196+
if (finger1 == finger3 && finger2 != finger1 && Math.abs(row1-row3) >= 2) {
197+
if (row1 <= 2 && row3 <= 2){
198+
sfs += count
199+
sfss[item] = count
200+
}
201+
}
202+
}
171203

172-
// if (lookup[a]){
173-
// row1 = lookup[a].row;
174-
// col1 = lookup[a].col;
175-
// finger1 = lookup[a].finger;
176-
// effort += lookup[a].effort * count
177-
// } else {
178-
// // console.log("Can't find lookup info for "+a);
179-
// finger1 = -1;
180-
// }
181-
// if (lookup[b]){
182-
// row2 = lookup[b].row;
183-
// col2 = lookup[b].col;
184-
// finger2 = lookup[b].finger;
185-
// effort += lookup[b].effort * count
186-
// } else {
187-
// // console.log("Can't find lookup info for "+a);
188-
// finger2 = -2;
189-
// }
190-
// if (lookup[c]){
191-
// row3 = lookup[c].row;
192-
// col3 = lookup[c].col;
193-
// finger3 = lookup[c].finger;
194-
// effort += lookup[c].effort * count
195-
// } else {
196-
// // console.log("Can't find lookup info for "+a);
197-
// finger3 = -3;
198-
// }
199204

200-
// }
201205
return {
202206
sfb: sfb,
203207
effort: effort,
@@ -207,6 +211,8 @@ function calculateMetrics(letter_freq, bigrams, config){
207211
prscissors: prscissors,
208212
wide_scissors: wide_scissors,
209213
lat_str: lat_str,
214+
sfs: sfs,
215+
sfss: sfss,
210216
hand_balance: hand_balance,
211217
vowels: vowels
212218
};
@@ -216,15 +222,13 @@ function calculateMetrics(letter_freq, bigrams, config){
216222
self.onmessage = function(e) {
217223
// Destructure the data and config from the event object
218224
// const { bigrams, trigrams, config } = e.data;
219-
const { letter_freq, bigrams, config } = e.data;
225+
const { letter_freq, bigrams, trigrams, config } = e.data;
220226

221-
// if (!bigrams || !config || !trigrams) {
222-
if (!letter_freq || !bigrams || !config) {
227+
if (!letter_freq || !bigrams || !config || !trigrams) {
223228
self.postMessage('Error: Missing data or config.');
224229
return;
225230
}
226-
// metrics = calculateMetrics(bigrams, trigrams, config);
227-
metrics = calculateMetrics(letter_freq, bigrams, config);
231+
metrics = calculateMetrics(letter_freq, bigrams, trigrams, config);
228232

229233
// Send the final results back to the main script
230234
self.postMessage({

0 commit comments

Comments
 (0)