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