public bool Equals(KeyboardPosition other)
 {
     if (ReferenceEquals(null, other))
         return false;
     if (ReferenceEquals(this, other))
         return true;
     return other.row == row && other.column == column;
 }
        public void TestAbKeyboard()
        {
            var keyboard = new Keyboard(new[]{2},SetUtil.NewHash('a','b'));

            var firstPos = new KeyboardPosition(0,0);
            var secondPos = new KeyboardPosition(0,1);
            var times = new TransitionTimes(keyboard);
            times[firstPos, secondPos] = 1;
            times[firstPos, firstPos] = 2;
            times[secondPos, secondPos] = 2;
            times[secondPos, firstPos] = 2;
            var goodLayout = new KeyboardLayout("ab", keyboard);
            var badLayout = new KeyboardLayout("ba",keyboard);
            var occurrences = new double[keyboard.AllChars.Count, keyboard.AllChars.Count];
            var corpus = new Corpus(occurrences, 1000,keyboard);
            corpus['a', 'b'] = 100;
            var goodScore = KeyboardEPAlgorithm.Score(goodLayout, corpus, times);
            var badScore = KeyboardEPAlgorithm.Score(badLayout, corpus, times);
            Assert.That(goodScore > badScore);
        }
        void KeyReleased(Keys releasedKey)
        {
            var releasedChar = GetKeyChar(releasedKey);
            if (releasedKey == Keys.Space || releasedChar == null)
            {
                lastPosition = null;
                return;
            }

            var now = DateTime.Now;
            var elapsedTime = (now - lastTime).TotalMilliseconds;
            var currentPosition = KeyboardLayout.QWERTY.GetCharPosition(releasedChar.Value);
            if (lastPosition != null && elapsedTime < MAXIMUM_TIME_BETWEEN_KEYS)
            {
                times[currentPosition, lastPosition].AddMeasurement(elapsedTime);
                Console.WriteLine(string.Format("adding measurement {0}", elapsedTime));
            }
            lastPosition = currentPosition;
            lastTime = now;
        }