147cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka/*
247cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka * Copyright (C) 2013 The Android Open Source Project
347cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka *
447cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka * Licensed under the Apache License, Version 2.0 (the "License");
547cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka * you may not use this file except in compliance with the License.
647cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka * You may obtain a copy of the License at
747cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka *
847cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka *      http://www.apache.org/licenses/LICENSE-2.0
947cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka *
1047cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka * Unless required by applicable law or agreed to in writing, software
1147cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka * distributed under the License is distributed on an "AS IS" BASIS,
1247cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1347cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka * See the License for the specific language governing permissions and
1447cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka * limitations under the License.
1547cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka */
1647cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka
1747cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka#ifndef LATINIME_PROXIMITY_INFO_STATE_UTILS_H
1847cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka#define LATINIME_PROXIMITY_INFO_STATE_UTILS_H
1947cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka
20d4828d5053ac30476b884c177235be0cac982c92Satoshi Kataoka#include <bitset>
218ca9be17db2f1845c7c7a3b584507cf60c9ca53dKen Wakasa#include <unordered_map>
2247cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka#include <vector>
2347cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka
2447cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka#include "defines.h"
2547cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka
2647cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataokanamespace latinime {
27ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataokaclass ProximityInfo;
28ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataokaclass ProximityInfoParams;
29ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka
3047cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataokaclass ProximityInfoStateUtils {
3147cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka public:
328ca9be17db2f1845c7c7a3b584507cf60c9ca53dKen Wakasa    typedef std::unordered_map<int, float> NearKeysDistanceMap;
33d4828d5053ac30476b884c177235be0cac982c92Satoshi Kataoka    typedef std::bitset<MAX_KEY_COUNT_IN_A_KEYBOARD> NearKeycodesSet;
34d4828d5053ac30476b884c177235be0cac982c92Satoshi Kataoka
3520b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka    static int trimLastTwoTouchPoints(std::vector<int> *sampledInputXs,
3620b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka            std::vector<int> *sampledInputYs, std::vector<int> *sampledInputTimes,
3720b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka            std::vector<int> *sampledLengthCache, std::vector<int> *sampledInputIndice);
3828c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa    static int updateTouchPoints(const ProximityInfo *const proximityInfo,
3928c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const int maxPointToKeyLength, const int *const inputProximities,
4047cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            const int *const inputXCoordinates, const int *const inputYCoordinates,
410052dbda762b1871c3214a6abeb5e89f11e091cdKeisuke Kuroynagi            const int *const times, const int *const pointerIds, const int inputSize,
4247cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            const bool isGeometric, const int pointerId, const int pushTouchPointStartIndex,
4347cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs,
4447cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            std::vector<int> *sampledInputTimes, std::vector<int> *sampledLengthCache,
45ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            std::vector<int> *sampledInputIndice);
466c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa    static const int *getProximityCodePointsAt(const int *const inputProximities, const int index);
47ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka    static int getPrimaryCodePointAt(const int *const inputProximities, const int index);
4847cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka    static void popInputData(std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs,
4947cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            std::vector<int> *sampledInputTimes, std::vector<int> *sampledLengthCache,
50ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            std::vector<int> *sampledInputIndice);
51ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka    static float refreshSpeedRates(const int inputSize, const int *const xCoordinates,
52ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const int *const yCoordinates, const int *const times, const int lastSavedInputSize,
53ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const int sampledInputSize, const std::vector<int> *const sampledInputXs,
54ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const std::vector<int> *const sampledInputYs,
55ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const std::vector<int> *const sampledInputTimes,
56ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const std::vector<int> *const sampledLengthCache,
57ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const std::vector<int> *const sampledInputIndice,
58ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            std::vector<float> *sampledSpeedRates, std::vector<float> *sampledDirections);
59d0d0113983f000fadc9da89271200620330b0356Keisuke Kuroyanagi    static void refreshBeelineSpeedRates(const int mostCommonKeyWidth, const float averageSpeed,
60ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const int inputSize, const int *const xCoordinates, const int *const yCoordinates,
61ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const int *times, const int sampledInputSize,
62ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const std::vector<int> *const sampledInputXs,
63ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const std::vector<int> *const sampledInputYs, const std::vector<int> *const inputIndice,
64ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            std::vector<int> *beelineSpeedPercentiles);
65ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka    static float getDirection(const std::vector<int> *const sampledInputXs,
666c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa            const std::vector<int> *const sampledInputYs, const int index0, const int index1);
6728c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa    static void updateAlignPointProbabilities(const float maxPointToKeyLength,
6828c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const int mostCommonKeyWidth, const int keyCount, const int start,
6928c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const int sampledInputSize, const std::vector<int> *const sampledInputXs,
70d4828d5053ac30476b884c177235be0cac982c92Satoshi Kataoka            const std::vector<int> *const sampledInputYs,
71d4828d5053ac30476b884c177235be0cac982c92Satoshi Kataoka            const std::vector<float> *const sampledSpeedRates,
72d4828d5053ac30476b884c177235be0cac982c92Satoshi Kataoka            const std::vector<int> *const sampledLengthCache,
73837f46dcb35a8f42a6bd5bc5fc6395d7386acb81Satoshi Kataoka            const std::vector<float> *const sampledNormalizedSquaredLengthCache,
7426c806620c26e048918624367ee624526613b0d2Keisuke Kuroyanagi            const ProximityInfo *const proximityInfo,
750b1fa0c1c7572893365c019780357a817158e5eaKen Wakasa            std::vector<std::unordered_map<int, float>> *charProbabilities);
76e5cdd21102e4e49b18c696261a084783eb6d7e7aSatoshi Kataoka    static void updateSampledSearchKeySets(const ProximityInfo *const proximityInfo,
7728c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const int sampledInputSize, const int lastSavedInputSize,
78e2912d17e4dab75b81f4c9e41a539e491ac059caSatoshi Kataoka            const std::vector<int> *const sampledLengthCache,
790b1fa0c1c7572893365c019780357a817158e5eaKen Wakasa            const std::vector<std::unordered_map<int, float>> *const charProbabilities,
80e5cdd21102e4e49b18c696261a084783eb6d7e7aSatoshi Kataoka            std::vector<NearKeycodesSet> *sampledSearchKeySets,
810b1fa0c1c7572893365c019780357a817158e5eaKen Wakasa            std::vector<std::vector<int>> *sampledSearchKeyVectors);
82d4828d5053ac30476b884c177235be0cac982c92Satoshi Kataoka    static float getPointToKeyByIdLength(const float maxPointToKeyLength,
83837f46dcb35a8f42a6bd5bc5fc6395d7386acb81Satoshi Kataoka            const std::vector<float> *const sampledNormalizedSquaredLengthCache, const int keyCount,
84d4828d5053ac30476b884c177235be0cac982c92Satoshi Kataoka            const int inputIndex, const int keyId);
8528c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa    static void initGeometricDistanceInfos(const ProximityInfo *const proximityInfo,
860052dbda762b1871c3214a6abeb5e89f11e091cdKeisuke Kuroynagi            const int sampledInputSize, const int lastSavedInputSize, const bool isGeometric,
87d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const std::vector<int> *const sampledInputXs,
88d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const std::vector<int> *const sampledInputYs,
89837f46dcb35a8f42a6bd5bc5fc6395d7386acb81Satoshi Kataoka            std::vector<float> *sampledNormalizedSquaredLengthCache);
9028c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa    static void initPrimaryInputWord(const int inputSize, const int *const inputProximities,
9128c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            int *primaryInputWord);
92d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka    static void dump(const bool isGeometric, const int inputSize,
93d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const int *const inputXCoordinates, const int *const inputYCoordinates,
94d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const int sampledInputSize, const std::vector<int> *const sampledInputXs,
95d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const std::vector<int> *const sampledInputYs,
96e2912d17e4dab75b81f4c9e41a539e491ac059caSatoshi Kataoka            const std::vector<int> *const sampledTimes,
97d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const std::vector<float> *const sampledSpeedRates,
98d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const std::vector<int> *const sampledBeelineSpeedPercentiles);
99394b0bd345f33b1314613a433478fd0bb711e0f7Satoshi Kataoka    static bool checkAndReturnIsContinuousSuggestionPossible(const int inputSize,
1009d18c6dd38c4d5632a5d5a5c26f567b9f6f7f969Satoshi Kataoka            const int *const xCoordinates, const int *const yCoordinates, const int *const times,
1019d18c6dd38c4d5632a5d5a5c26f567b9f6f7f969Satoshi Kataoka            const int sampledInputSize, const std::vector<int> *const sampledInputXs,
1029d18c6dd38c4d5632a5d5a5c26f567b9f6f7f969Satoshi Kataoka            const std::vector<int> *const sampledInputYs,
1039d18c6dd38c4d5632a5d5a5c26f567b9f6f7f969Satoshi Kataoka            const std::vector<int> *const sampledTimes,
1049d18c6dd38c4d5632a5d5a5c26f567b9f6f7f969Satoshi Kataoka            const std::vector<int> *const sampledInputIndices);
10520b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka    // TODO: Move to most_probable_string_utils.h
10628c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa    static float getMostProbableString(const ProximityInfo *const proximityInfo,
10728c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const int sampledInputSize,
1080b1fa0c1c7572893365c019780357a817158e5eaKen Wakasa            const std::vector<std::unordered_map<int, float>> *const charProbabilities,
10920b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka            int *const codePointBuf);
11020b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka
11147cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka private:
11247cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka    DISALLOW_IMPLICIT_CONSTRUCTORS(ProximityInfoStateUtils);
11347cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka
11447cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka    static float updateNearKeysDistances(const ProximityInfo *const proximityInfo,
11547cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            const float maxPointToKeyLength, const int x, const int y,
1160052dbda762b1871c3214a6abeb5e89f11e091cdKeisuke Kuroynagi            const bool isGeometric,
117ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            NearKeysDistanceMap *const currentNearKeysDistances);
11847cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka    static bool isPrevLocalMin(const NearKeysDistanceMap *const currentNearKeysDistances,
11947cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            const NearKeysDistanceMap *const prevNearKeysDistances,
120ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const NearKeysDistanceMap *const prevPrevNearKeysDistances);
1216c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa    static float getPointScore(const int mostCommonKeyWidth, const int x, const int y,
1226c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa            const int time, const bool lastPoint, const float nearest, const float sumAngle,
1236c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa            const NearKeysDistanceMap *const currentNearKeysDistances,
12447cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            const NearKeysDistanceMap *const prevNearKeysDistances,
12547cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            const NearKeysDistanceMap *const prevPrevNearKeysDistances,
126ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs);
12728c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa    static bool pushTouchPoint(const ProximityInfo *const proximityInfo,
12828c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const int maxPointToKeyLength, const int inputIndex, const int nodeCodePoint, int x,
1290052dbda762b1871c3214a6abeb5e89f11e091cdKeisuke Kuroynagi            int y, const int time, const bool isGeometric,
130a1d84bcf8ffd031c135b6f3f8c94b6732071849bSatoshi Kataoka            const bool doSampling, const bool isLastPoint,
13128c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const float sumAngle, NearKeysDistanceMap *const currentNearKeysDistances,
13247cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            const NearKeysDistanceMap *const prevNearKeysDistances,
13347cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            const NearKeysDistanceMap *const prevPrevNearKeysDistances,
13447cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs,
13547cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            std::vector<int> *sampledInputTimes, std::vector<int> *sampledLengthCache,
136ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            std::vector<int> *sampledInputIndice);
137ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka    static float calculateBeelineSpeedRate(const int mostCommonKeyWidth, const float averageSpeed,
138ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const int id, const int inputSize, const int *const xCoordinates,
139ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const int *const yCoordinates, const int *times, const int sampledInputSize,
140ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const std::vector<int> *const sampledInputXs,
141ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const std::vector<int> *const sampledInputYs,
142ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const std::vector<int> *const inputIndice);
14328c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa    static float getPointAngle(const std::vector<int> *const sampledInputXs,
144d4828d5053ac30476b884c177235be0cac982c92Satoshi Kataoka            const std::vector<int> *const sampledInputYs, const int index);
14528c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa    static float getPointsAngle(const std::vector<int> *const sampledInputXs,
14628c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const std::vector<int> *const sampledInputYs, const int index0, const int index1,
14728c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const int index2);
148d4828d5053ac30476b884c177235be0cac982c92Satoshi Kataoka    static bool suppressCharProbabilities(const int mostCommonKeyWidth,
14928c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const int sampledInputSize, const std::vector<int> *const lengthCache, const int index0,
1500b1fa0c1c7572893365c019780357a817158e5eaKen Wakasa            const int index1, std::vector<std::unordered_map<int, float>> *charProbabilities);
151d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka    static float calculateSquaredDistanceFromSweetSpotCenter(
152d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const ProximityInfo *const proximityInfo, const std::vector<int> *const sampledInputXs,
153d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const std::vector<int> *const sampledInputYs, const int keyIndex,
154d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const int inputIndex);
15528c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa     static float calculateNormalizedSquaredDistance(const ProximityInfo *const proximityInfo,
15628c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const std::vector<int> *const sampledInputXs,
157d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const std::vector<int> *const sampledInputYs, const int keyIndex, const int inputIndex);
15847cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka};
15947cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka} // namespace latinime
16047cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka#endif // LATINIME_PROXIMITY_INFO_STATE_UTILS_H
161