13e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka/* 23e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * Copyright (C) 2012 The Android Open Source Project 33e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * 43e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * Licensed under the Apache License, Version 2.0 (the "License"); 53e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * you may not use this file except in compliance with the License. 63e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * You may obtain a copy of the License at 73e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * 83e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * http://www.apache.org/licenses/LICENSE-2.0 93e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * 103e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * Unless required by applicable law or agreed to in writing, software 113e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * distributed under the License is distributed on an "AS IS" BASIS, 123e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * See the License for the specific language governing permissions and 143e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * limitations under the License. 153e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka */ 163e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 173e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka#ifndef LATINIME_PROXIMITY_INFO_STATE_H 183e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka#define LATINIME_PROXIMITY_INFO_STATE_H 193e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 20162c211b44c1546b2e9be36e0cec50de497217a9Ken Wakasa#include <cstring> // for memset() 218ca9be17db2f1845c7c7a3b584507cf60c9ca53dKen Wakasa#include <unordered_map> 22687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka#include <vector> 233e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 243e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka#include "defines.h" 2529432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa#include "suggest/core/layout/proximity_info_params.h" 2629432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa#include "suggest/core/layout/proximity_info_state_utils.h" 273e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 283e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataokanamespace latinime { 293e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 303e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataokaclass ProximityInfo; 313e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 323e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataokaclass ProximityInfoState { 333e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka public: 343e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka ///////////////////////////////////////// 353e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka // Defined in proximity_info_state.cpp // 363e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka ///////////////////////////////////////// 37233aad5e5c7567a97af30f38f50a65365f729dfeSatoshi Kataoka void initInputParams(const int pointerId, const float maxPointToKeyLength, 381e61493c50082264caaef862df02b1ccc84dc396Ken Wakasa const ProximityInfo *proximityInfo, const int *const inputCodes, 3908f00cf55f2e083c1ed254a32495b622c9ad9862Satoshi Kataoka const int inputSize, const int *xCoordinates, const int *yCoordinates, 404ef27c035892888df82d9c9f32ac12ed48c8308fJean Chalard const int *const times, const int *const pointerIds, const bool isGeometric, 414ef27c035892888df82d9c9f32ac12ed48c8308fJean Chalard const std::vector<int> *locale); 423e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 433e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka ///////////////////////////////////////// 443e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka // Defined here // 453e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka ///////////////////////////////////////// 466e66349ed1d37c24a1a23bf117df6750ad53d322Ken Wakasa AK_FORCE_INLINE ProximityInfoState() 476c7ebc4023086fd61dcc19688663616c4781672aKeisuke Kuroyanagi : mProximityInfo(nullptr), mMaxPointToKeyLength(0.0f), mAverageSpeed(0.0f), 480c2227ab991774768414d8ea60a469f005eb9f1aKen Wakasa mHasTouchPositionCorrectionData(false), mMostCommonKeyWidthSquare(0), 49162c211b44c1546b2e9be36e0cec50de497217a9Ken Wakasa mKeyCount(0), mCellHeight(0), mCellWidth(0), mGridHeight(0), mGridWidth(0), 50f1233b58c2d81b575c92339f146cfe0f73a992faKeisuke Kuroyanagi mIsContinuousSuggestionPossible(false), mHasBeenUpdatedByGeometricInput(false), 51f1233b58c2d81b575c92339f146cfe0f73a992faKeisuke Kuroyanagi mSampledInputXs(), mSampledInputYs(), mSampledTimes(), mSampledInputIndice(), 52f1233b58c2d81b575c92339f146cfe0f73a992faKeisuke Kuroyanagi mSampledLengthCache(), mBeelineSpeedPercentiles(), 53f1233b58c2d81b575c92339f146cfe0f73a992faKeisuke Kuroyanagi mSampledNormalizedSquaredLengthCache(), mSpeedRates(), mDirections(), 54bc9500fb14622f8b185e30a10a7c0b4c5a29930aKeisuke Kuroyanagi mCharProbabilities(), mSampledSearchKeySets(), mSampledSearchKeyVectors(), 55bc9500fb14622f8b185e30a10a7c0b4c5a29930aKeisuke Kuroyanagi mTouchPositionCorrectionEnabled(false), mSampledInputSize(0), 56bc9500fb14622f8b185e30a10a7c0b4c5a29930aKeisuke Kuroyanagi mMostProbableStringProbability(0.0f) { 57bf78e1371c12d819020d60f0e585f5e6c26e6aa2Satoshi Kataoka memset(mInputProximities, 0, sizeof(mInputProximities)); 58162c211b44c1546b2e9be36e0cec50de497217a9Ken Wakasa memset(mPrimaryInputWord, 0, sizeof(mPrimaryInputWord)); 5920b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka memset(mMostProbableString, 0, sizeof(mMostProbableString)); 60162c211b44c1546b2e9be36e0cec50de497217a9Ken Wakasa } 61162c211b44c1546b2e9be36e0cec50de497217a9Ken Wakasa 626e66349ed1d37c24a1a23bf117df6750ad53d322Ken Wakasa // Non virtual inline destructor -- never inherit this class 636e66349ed1d37c24a1a23bf117df6750ad53d322Ken Wakasa AK_FORCE_INLINE ~ProximityInfoState() {} 643e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 651e61493c50082264caaef862df02b1ccc84dc396Ken Wakasa inline int getPrimaryCodePointAt(const int index) const { 661e61493c50082264caaef862df02b1ccc84dc396Ken Wakasa return getProximityCodePointsAt(index)[0]; 673e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 683e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 692fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa int getPrimaryOriginalCodePointAt(const int index) const; 702fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 7120b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka inline bool sameAsTyped(const int *word, int length) const { 7220b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka if (length != mSampledInputSize) { 7320b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka return false; 7420b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka } 7520b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka const int *inputProximities = mInputProximities; 7620b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka while (length--) { 7720b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka if (*inputProximities != *word) { 7820b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka return false; 7920b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka } 8020b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka inputProximities += MAX_PROXIMITY_CHARS_SIZE; 8120b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka word++; 8220b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka } 8320b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka return true; 8420b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka } 8520b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka 866e66349ed1d37c24a1a23bf117df6750ad53d322Ken Wakasa AK_FORCE_INLINE bool existsCodePointInProximityAt(const int index, const int c) const { 871e61493c50082264caaef862df02b1ccc84dc396Ken Wakasa const int *codePoints = getProximityCodePointsAt(index); 883e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka int i = 0; 896c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa while (codePoints[i] > 0 && i < MAX_PROXIMITY_CHARS_SIZE) { 901e61493c50082264caaef862df02b1ccc84dc396Ken Wakasa if (codePoints[i++] == c) { 913e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka return true; 923e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 933e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 943e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka return false; 953e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 963e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 9724706f8f5c61785006af50cc19fdd96559faa9faKeisuke Kuroynagi AK_FORCE_INLINE bool existsAdjacentProximityChars(const int index) const { 98feec20a692c9ffdecf7855a45531a12f129086caSatoshi Kataoka if (index < 0 || index >= mSampledInputSize) return false; 991e61493c50082264caaef862df02b1ccc84dc396Ken Wakasa const int currentCodePoint = getPrimaryCodePointAt(index); 1003e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const int leftIndex = index - 1; 1011e61493c50082264caaef862df02b1ccc84dc396Ken Wakasa if (leftIndex >= 0 && existsCodePointInProximityAt(leftIndex, currentCodePoint)) { 1023e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka return true; 1033e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 1043e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const int rightIndex = index + 1; 105feec20a692c9ffdecf7855a45531a12f129086caSatoshi Kataoka if (rightIndex < mSampledInputSize 106feec20a692c9ffdecf7855a45531a12f129086caSatoshi Kataoka && existsCodePointInProximityAt(rightIndex, currentCodePoint)) { 1073e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka return true; 1083e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 1093e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka return false; 1103e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 1113e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 1123e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka inline bool touchPositionCorrectionEnabled() const { 1133e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka return mTouchPositionCorrectionEnabled; 1143e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 1153e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 116687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka bool isUsed() const { 117feec20a692c9ffdecf7855a45531a12f129086caSatoshi Kataoka return mSampledInputSize > 0; 118687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka } 119687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka 120203b2138136bc00219d371897237f6b0b1795b9cSatoshi Kataoka int size() const { 121feec20a692c9ffdecf7855a45531a12f129086caSatoshi Kataoka return mSampledInputSize; 12237b153e205c9672b299b47e97921fee2462a78bbSatoshi Kataoka } 12337b153e205c9672b299b47e97921fee2462a78bbSatoshi Kataoka 1243811a28ddc07201930e0bbd2e1d01045b59af308Keisuke Kuroyanagi int getInputX(const int index) const { 125feec20a692c9ffdecf7855a45531a12f129086caSatoshi Kataoka return mSampledInputXs[index]; 12637b153e205c9672b299b47e97921fee2462a78bbSatoshi Kataoka } 12737b153e205c9672b299b47e97921fee2462a78bbSatoshi Kataoka 1283811a28ddc07201930e0bbd2e1d01045b59af308Keisuke Kuroyanagi int getInputY(const int index) const { 129feec20a692c9ffdecf7855a45531a12f129086caSatoshi Kataoka return mSampledInputYs[index]; 13037b153e205c9672b299b47e97921fee2462a78bbSatoshi Kataoka } 13137b153e205c9672b299b47e97921fee2462a78bbSatoshi Kataoka 1324e17b42d0fd104ec2cd3a79db2473863228ecb62Keisuke Kuroyanagi int getInputIndexOfSampledPoint(const int sampledIndex) const { 1334e17b42d0fd104ec2cd3a79db2473863228ecb62Keisuke Kuroyanagi return mSampledInputIndice[sampledIndex]; 1344e17b42d0fd104ec2cd3a79db2473863228ecb62Keisuke Kuroyanagi } 1354e17b42d0fd104ec2cd3a79db2473863228ecb62Keisuke Kuroyanagi 136f32869c6b6296a8bf594abdf0b18281d9312e54fSatoshi Kataoka bool hasSpaceProximity(const int index) const; 137f32869c6b6296a8bf594abdf0b18281d9312e54fSatoshi Kataoka 1383811a28ddc07201930e0bbd2e1d01045b59af308Keisuke Kuroyanagi int getLengthCache(const int index) const { 139d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka return mSampledLengthCache[index]; 14037b153e205c9672b299b47e97921fee2462a78bbSatoshi Kataoka } 14137b153e205c9672b299b47e97921fee2462a78bbSatoshi Kataoka 142394b0bd345f33b1314613a433478fd0bb711e0f7Satoshi Kataoka bool isContinuousSuggestionPossible() const { 143394b0bd345f33b1314613a433478fd0bb711e0f7Satoshi Kataoka return mIsContinuousSuggestionPossible; 144096f35ff4b5413906e2a339663baf16e5dabaf64Keisuke Kuroyanagi } 145096f35ff4b5413906e2a339663baf16e5dabaf64Keisuke Kuroyanagi 146837f46dcb35a8f42a6bd5bc5fc6395d7386acb81Satoshi Kataoka // TODO: Rename s/Length/NormalizedSquaredLength/ 147806eba452423e5e5971ef096dfae3fed180db665Keisuke Kuroyanagi float getPointToKeyByIdLength(const int inputIndex, const int keyId) const; 148837f46dcb35a8f42a6bd5bc5fc6395d7386acb81Satoshi Kataoka // TODO: Rename s/Length/NormalizedSquaredLength/ 1492192d08b9cca6a40d834d6a5001d19b5845ed8a0Tom Ouyang float getPointToKeyLength(const int inputIndex, const int codePoint) const; 150687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka 151697a9d3541dd5b643664fc1af9b3265267370127Satoshi Kataoka ProximityType getProximityType(const int index, const int codePoint, 1522c2f3a90d8115777adbe9ffd597f344aede84276Ken Wakasa const bool checkProximityChars, int *proximityIndex = 0) const; 1532c2f3a90d8115777adbe9ffd597f344aede84276Ken Wakasa 154697a9d3541dd5b643664fc1af9b3265267370127Satoshi Kataoka ProximityType getProximityTypeG(const int index, const int codePoint) const; 155697a9d3541dd5b643664fc1af9b3265267370127Satoshi Kataoka 1569af533538ea749d7c930bb3125fa4d3e4feb8478Satoshi Kataoka float getSpeedRate(const int index) const { 1579af533538ea749d7c930bb3125fa4d3e4feb8478Satoshi Kataoka return mSpeedRates[index]; 1589af533538ea749d7c930bb3125fa4d3e4feb8478Satoshi Kataoka } 1599af533538ea749d7c930bb3125fa4d3e4feb8478Satoshi Kataoka 1606ae8dd4343445d2df4444388b605d2aa930fa2a0Satoshi Kataoka AK_FORCE_INLINE int getBeelineSpeedPercentile(const int id) const { 1616ae8dd4343445d2df4444388b605d2aa930fa2a0Satoshi Kataoka return mBeelineSpeedPercentiles[id]; 1626ae8dd4343445d2df4444388b605d2aa930fa2a0Satoshi Kataoka } 1636ae8dd4343445d2df4444388b605d2aa930fa2a0Satoshi Kataoka 1646ae8dd4343445d2df4444388b605d2aa930fa2a0Satoshi Kataoka AK_FORCE_INLINE DoubleLetterLevel getDoubleLetterLevel(const int id) const { 1656ae8dd4343445d2df4444388b605d2aa930fa2a0Satoshi Kataoka const int beelineSpeedRate = getBeelineSpeedPercentile(id); 1666ae8dd4343445d2df4444388b605d2aa930fa2a0Satoshi Kataoka if (beelineSpeedRate == 0) { 1676ae8dd4343445d2df4444388b605d2aa930fa2a0Satoshi Kataoka return A_STRONG_DOUBLE_LETTER; 168ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka } else if (beelineSpeedRate 169ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka < ProximityInfoParams::MIN_DOUBLE_LETTER_BEELINE_SPEED_PERCENTILE) { 1706ae8dd4343445d2df4444388b605d2aa930fa2a0Satoshi Kataoka return A_DOUBLE_LETTER; 1716ae8dd4343445d2df4444388b605d2aa930fa2a0Satoshi Kataoka } else { 1726ae8dd4343445d2df4444388b605d2aa930fa2a0Satoshi Kataoka return NOT_A_DOUBLE_LETTER; 1736ae8dd4343445d2df4444388b605d2aa930fa2a0Satoshi Kataoka } 17428661069591fd1d6a8e25981aaade2e5d8b20b9aKeisuke Kuroyanagi } 175806eba452423e5e5971ef096dfae3fed180db665Keisuke Kuroyanagi 1761e06a4d8e9e71188ed685282155ea52a48ddc050Keisuke Kuroyanagi float getDirection(const int index) const { 1771e06a4d8e9e71188ed685282155ea52a48ddc050Keisuke Kuroyanagi return mDirections[index]; 1781e06a4d8e9e71188ed685282155ea52a48ddc050Keisuke Kuroyanagi } 179ff74cc3e5e75fc0c6b9ffaa5e68d879775dc6115Keisuke Kuroyanagi // get xy direction 180ff74cc3e5e75fc0c6b9ffaa5e68d879775dc6115Keisuke Kuroyanagi float getDirection(const int x, const int y) const; 181ff74cc3e5e75fc0c6b9ffaa5e68d879775dc6115Keisuke Kuroyanagi 182e0349619acdba79223390c9925d81f7e88c7f8adSatoshi Kataoka float getMostProbableString(int *const codePointBuf) const; 183ff74cc3e5e75fc0c6b9ffaa5e68d879775dc6115Keisuke Kuroyanagi 184ff74cc3e5e75fc0c6b9ffaa5e68d879775dc6115Keisuke Kuroyanagi float getProbability(const int index, const int charCode) const; 185ff74cc3e5e75fc0c6b9ffaa5e68d879775dc6115Keisuke Kuroyanagi 186ff74cc3e5e75fc0c6b9ffaa5e68d879775dc6115Keisuke Kuroyanagi bool isKeyInSerchKeysAfterIndex(const int index, const int keyId) const; 187e599d7e317092da396ab0a9d2098c170e3b98dc6Ken Wakasa 1883e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka private: 1891bc038c5e40bd0fa7a44331a569abe3ae88f0152satok DISALLOW_COPY_AND_ASSIGN(ProximityInfoState); 1903e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 1911e61493c50082264caaef862df02b1ccc84dc396Ken Wakasa inline const int *getProximityCodePointsAt(const int index) const { 19247cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka return ProximityInfoStateUtils::getProximityCodePointsAt(mInputProximities, index); 193fee0ac60b1cd0a4760ca8f310ff8a86b925d833bKen Wakasa } 194d9c10b19793b011f862e3dd31883f746044431d7Keisuke Kuroyanagi 1954a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka // const 1964a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka const ProximityInfo *mProximityInfo; 197687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka float mMaxPointToKeyLength; 1989af533538ea749d7c930bb3125fa4d3e4feb8478Satoshi Kataoka float mAverageSpeed; 1994a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka bool mHasTouchPositionCorrectionData; 2004a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka int mMostCommonKeyWidthSquare; 2014a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka int mKeyCount; 2024a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka int mCellHeight; 2034a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka int mCellWidth; 2044a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka int mGridHeight; 2054a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka int mGridWidth; 206394b0bd345f33b1314613a433478fd0bb711e0f7Satoshi Kataoka bool mIsContinuousSuggestionPossible; 207f1233b58c2d81b575c92339f146cfe0f73a992faKeisuke Kuroyanagi bool mHasBeenUpdatedByGeometricInput; 2083e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 209feec20a692c9ffdecf7855a45531a12f129086caSatoshi Kataoka std::vector<int> mSampledInputXs; 210feec20a692c9ffdecf7855a45531a12f129086caSatoshi Kataoka std::vector<int> mSampledInputYs; 211d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka std::vector<int> mSampledTimes; 212d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka std::vector<int> mSampledInputIndice; 213d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka std::vector<int> mSampledLengthCache; 2146ae8dd4343445d2df4444388b605d2aa930fa2a0Satoshi Kataoka std::vector<int> mBeelineSpeedPercentiles; 215837f46dcb35a8f42a6bd5bc5fc6395d7386acb81Satoshi Kataoka std::vector<float> mSampledNormalizedSquaredLengthCache; 2169af533538ea749d7c930bb3125fa4d3e4feb8478Satoshi Kataoka std::vector<float> mSpeedRates; 2171e06a4d8e9e71188ed685282155ea52a48ddc050Keisuke Kuroyanagi std::vector<float> mDirections; 218806eba452423e5e5971ef096dfae3fed180db665Keisuke Kuroyanagi // probabilities of skipping or mapping to a key for each point. 2190b1fa0c1c7572893365c019780357a817158e5eaKen Wakasa std::vector<std::unordered_map<int, float>> mCharProbabilities; 220ff74cc3e5e75fc0c6b9ffaa5e68d879775dc6115Keisuke Kuroyanagi // The vector for the key code set which holds nearby keys of some trailing sampled input points 221ff74cc3e5e75fc0c6b9ffaa5e68d879775dc6115Keisuke Kuroyanagi // for each sampled input point. These nearby keys contain the next characters which can be in 222ff74cc3e5e75fc0c6b9ffaa5e68d879775dc6115Keisuke Kuroyanagi // the dictionary. Specifically, currently we are looking for keys nearby trailing sampled 223ff74cc3e5e75fc0c6b9ffaa5e68d879775dc6115Keisuke Kuroyanagi // inputs including the current input point. 224e5cdd21102e4e49b18c696261a084783eb6d7e7aSatoshi Kataoka std::vector<ProximityInfoStateUtils::NearKeycodesSet> mSampledSearchKeySets; 2250b1fa0c1c7572893365c019780357a817158e5eaKen Wakasa std::vector<std::vector<int>> mSampledSearchKeyVectors; 2263e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka bool mTouchPositionCorrectionEnabled; 2276c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa int mInputProximities[MAX_PROXIMITY_CHARS_SIZE * MAX_WORD_LENGTH]; 228feec20a692c9ffdecf7855a45531a12f129086caSatoshi Kataoka int mSampledInputSize; 2295db594abbad2d9e8d2cf1aa6e417aa50ffc5dfc1Ken Wakasa int mPrimaryInputWord[MAX_WORD_LENGTH]; 23020b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka float mMostProbableStringProbability; 23120b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka int mMostProbableString[MAX_WORD_LENGTH]; 2323e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka}; 2333e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka} // namespace latinime 2343e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka#endif // LATINIME_PROXIMITY_INFO_STATE_H 235