Hi, 

Ich habe check_neo inzwischen so weit, dass es auf die meisten Kriterien 
prüfen und ein Layout darauf optimieren kann. 

Allerdings arbeitet das Layout aktuell mit hächstens abgeschätzten Parametern, 
daher brauche ich Hilfe, um es wirklich sinnvoll zu machen. 

Das Layout verwendet Kostenparameter, um die Güte eines Layouts zu berechnen, 
und alles steht und fällt damit, wie gut diese Parameter sind (zusammen mit 
der Qualität der Wortliste). 

Ihr könnt die Parameter recht einfach selbst anpassen und mit euren Werten 
testen (sie stehen im Skript aktuell in den Zeilen 257 bis 276, kommen aber 
auch gleich in dieser Mail: http://bitbucket.org/ArneBab/evolve-keyboard-
layout/src/4bc6c132ec95/check_neo.py#cl-257 ). 

Bitte nicht erschrecken, wenn das etwas unübersichtlich wirkt. Sie sind alle 
hinter dem Wert auf Englisch erklärt. 

Jeder Wert hier steht für die Gewichtung einer Kostenfunktion. Desto höher sie 
ist, desto wichtiger ist der Punkt in der Berechnung. 

Wenn ihr zu einer davon Fragen oder Anmerkungen habt, dann schreibt es bitte! 


WEIGHT_POSITION = 1 #: reference
WEIGHT_FINGER_REPEATS = 8 #: higher than a switch from center to side, but 
lower than a switch from center to upper left.
WEIGHT_FINGER_REPEATS_TOP_BOTTOM = 16 #: 2 times a normal repeat, since it's 
really slow. Better two outside low or up than an up-down repeat. 
WEIGHT_FINGER_DISBALANCE = 5 #: multiplied with the standard deviation of the 
finger usage - value guessed and only valid for the 1gramme.txt corpus.
WEIGHT_TOO_LITTLE_HANDSWITCHING = 1 #: how high should it be counted, if the 
hands aren’t switched in a triple?
WEIGHT_INTENDED_FINGER_LOAD_LEFT_PINKY_TO_RIGHT_PINKY = [
    1,
    2,
    2,
    3,
    1,
    1,
    3,
    2,
    2,
    1] #: The intended load per finger. Inversed and then used as multiplier 
for the finger load before calculating the finger disbalance penalty. Any load 
distribution which strays from this optimum gives a penalty.
WEIGHT_XCVZ_ON_BAD_POSITION = 0.1 #: the penalty *per letter* in the text if 
xvcz are on bad positions (cumulative; if all 4 are on bad positions (not in 
the first 5 keys, counted from the left side horizontally) we get 4 times the 
penalty). 


Außerdem gibt es noch die Kosten pro Taste, Zeile 356 ( 
http://bitbucket.org/ArneBab/evolve-keyboard-
layout/src/4bc6c132ec95/check_neo.py#cl-356 )
Hier müssen noch die Kosten für die Gesamtbelastung der Finger rausgenommen 
werden, da die schon woanders abgedeckt werden. Also sollte nur noch die 
Erreichbarkeit der Taste (und die Geschwindigkeit des jew. Fingers) und die 
Belastung die ein Druck auf genau diese Taste bringt drinstehen, nicht aber 
sowas wie „der Kleine ist eh schwächer, auch wenn genau die Taste für ihn 
eigentlich kein Problem ist“. 

# Structured reweighting (but still mostly from experience and deducing from 
the work of others). 
COST_PER_KEY  = [ # 0 heißt nicht beachtet
        [0,0,0,0,0,0,0,0,0,0,0,0,0,0], # Zahlenreihe (0)
        [0, 12,9,6,4,10,10,4,6,9,12,15,18,0], # Reihe 1
        [0,  5,3,3,2,5,5,2,3,3,5,12,0,15], # Reihe 2 
        [15,0,10,11,11,7,12,10,7,11,11,10,15],     # Reihe 3
        [0,0,0,     5     ,0,0,0,0] # Reihe 4 mit Leertaste
]

Der Punkt braucht allerdings überarbeitung. Wenn sich jemand von euch mal die 
Kosten pro Taste vornehmen will, würde ich (dem Vorschlag von Michael 
Ostermeier folgend) vorschlagen, dem Zeigefinger nicht wie hier 2, sondern 10 
Strafpunkte zu geben, dann haben wir mehr Flexibilität. Die Bedingung ist, 
dass die Punkte ganze Zahlen sind (sonst wird der Code unnötig langsamer). 


Nun aber dazu, wie ihr es selbst testen könnt (nur unter GNU/Linux geprüft; 
ich habe hier nichts anderes): 

1. Tarball-Snapshot (braucht Python3 → http://python.org/download )
- wget http://bitbucket.org/ArneBab/evolve-keyboard-
layout/get/55e78a669261.bz2
- tar xf 55e78a669261.bz2
- cd evolve-keyboard-layout/
- ./check_neo.py

2. Versionsverwaltung (braucht Python3 und Mercurial): 
- (falls noch nicht vorhanden: easy_install mercurial )
- hg clone https://[email protected]/ArneBab/evolve-keyboard-layout/
- cd evolve-keyboard-layout/
- ./check_neo.py

Der Aufruf started den Vergleich der Ergebnisse für Neo, Qwertz, Nordtast, 
Dvorak und Colemak. Alle Vergleiche nutzen die Leipziger Wortliste. Wenn ihr 
eine andere Wortlist wollt, müsst ihr nur 1gramme.txt, 2gramme.txt und 
3gramme.txt austauschen. 


Zusätzlich könnt ihr ein Layout durch zufällige Mutationen entwickeln lassen, 
d.h. es werden zufällig Tasten vertauscht, und wenn das mutierte Layout besser 
ist (weniger Strafpunkte hat) als das alte, wird die Mutation behalten. 

Was z.B. interessant sein dürfte: 

        ./check_neo.py --evolve 1000
        1000 Mutationen testen. 


Ein paar andere Methoden findet ihr via 

        ./check_neo.py --help

Das einfachste evolve scheint aber am effizientesten zu sein. 

Mit der Bash könnt ihr außerdem viele Ergebnisse hintereinander berechnen 
(z.B. nützlich, um den Rechner eine Urlaubswoche lang arbeiten zu lassen). 
Hier z.B. für 100 Layouts: 

        for i in {0..99}; do time ./check_neo.py --evolve 1000 --prerandomize 
10000 -q; done>> 2010-03-28-evolve-1000-results.txt

„-q“ hier sagt: zeig mir nur das Ergebnis, nicht die Zwischenschritte. 

Das beste findet ihr hier z.B. via grep, sort und tail. Hier für 
Fingerwiederholungen 

        grep 2gramme 2010-03-28-evolve-1000-results.txt | sort -ur | tail

Dann nach dem besten Ergebnis suchen. Mein aktuell bestes für 
Fingerwiederholungen: 

        grep "1.02004994329 % finger repeats in file 2gramme.txt" 2010-03-26-
evolve-10000-results.txt  -A3 -B8
# Evolved Layout
[['^', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '`', ()],
 [(), 'ö', 'w', 'c', 'a', 'ä', 'f', 'h', 'u', 'm', 'y', 'x', '´', ()],
 ['⇩', 't', 'n', 'r', 'e', 'o', 'g', 'd', 'i', 's', 'l', 'ß', '⇘', '\n'],
 ['⇧', (), 'ü', 'p', 'v', '.', 'q', 'k', 'b', 'j', 'z', ',', '⇗'],
 [(), (), (), ' ', (), (), (), ()]]
# 1.30856908 billion total penalty compared to notime-noeffort
# 14.8497008604 million keystrokes disbalance of the fingers
# 1.02004994329 % finger repeats in file 2gramme.txt
# 0.212532496307 % finger repeats top to bottom or vice versa
# 8.94816062502 % of trigrams have no handswitching (uppercase ignored)
# 4.00409258152 mean key position cost in file 1gramme.txt


Nebenbei: Die Befehle hängen alle an die Ausgabedatei an, so dass es nur eine 
sehr geringe Chance gibt, dass sie sich in die Quere kommen, wenn ihr einfach 
mehrere nebeneinanden startet. Am effizientesten ist einer pro Prozessorkern. 

Ich lasse dieses Wochenende so eine Rechnung laufen, allerdings gleich mit 
10 000 Mutationsschritten, so dass bei mir ein einzelner Durchlauf knapp 5 
Stunden dauert. 


Nun aber viel Spaß beim Spielen :)

Ich würde mich über eure Rückmeldung freuen - und natürlich auch darüber, wenn 
ihr eure interessantesten Ergebnisse schreibt. 

Liebe Grüße, 
Arne

PS: Solltet ihr auf einen Bug stoßen, dann schreibt das bitte auch. Ich habe 
die letzten Tage recht viel umstrukturiert, so dass sich noch ein paar Fehler 
im Code verstecken könnten…

PPS: Die Tests laufen grade nicht ganz durch, weil ich an ein paar 
Kostenfunktionen gedreht habe, also erschreckt nicht, wenn 
./check-neo.py --check Fehler auswirft.


--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- 
   - singing a part of the history of free software -
              http://infinite-hands.draketo.de

Attachment: signature.asc
Description: This is a digitally signed message part.

Antwort per Email an