proximity_info_state_utils.h revision 394b0bd345f33b1314613a433478fd0bb711e0f7
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>
2147cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka#include <vector>
2247cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka
2347cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka#include "defines.h"
24d4828d5053ac30476b884c177235be0cac982c92Satoshi Kataoka#include "hash_map_compat.h"
2547cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka
2647cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataokanamespace latinime {
27ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataokaclass ProximityInfo;
28ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataokaclass ProximityInfoParams;
29ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka
3047cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataokaclass ProximityInfoStateUtils {
3147cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka public:
32d4828d5053ac30476b884c177235be0cac982c92Satoshi Kataoka    typedef hash_map_compat<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,
4147cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            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);
59ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka    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,
73e5aad5646309e80e1cd71533fb47a6be43f3aa2fSatoshi Kataoka            const std::vector<float> *const SampledDistanceCache_G,
74e5cdd21102e4e49b18c696261a084783eb6d7e7aSatoshi Kataoka            std::vector<NearKeycodesSet> *SampledNearKeySets,
75d4828d5053ac30476b884c177235be0cac982c92Satoshi Kataoka            std::vector<hash_map_compat<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,
79e5cdd21102e4e49b18c696261a084783eb6d7e7aSatoshi Kataoka            const std::vector<NearKeycodesSet> *const SampledNearKeySets,
80e5cdd21102e4e49b18c696261a084783eb6d7e7aSatoshi Kataoka            std::vector<NearKeycodesSet> *sampledSearchKeySets,
81e5cdd21102e4e49b18c696261a084783eb6d7e7aSatoshi Kataoka            std::vector<std::vector<int> > *sampledSearchKeyVectors);
82d4828d5053ac30476b884c177235be0cac982c92Satoshi Kataoka    static float getPointToKeyByIdLength(const float maxPointToKeyLength,
83e5aad5646309e80e1cd71533fb47a6be43f3aa2fSatoshi Kataoka            const std::vector<float> *const SampledDistanceCache_G, const int keyCount,
84d4828d5053ac30476b884c177235be0cac982c92Satoshi Kataoka            const int inputIndex, const int keyId);
8528c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa    static void initGeometricDistanceInfos(const ProximityInfo *const proximityInfo,
86d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const int sampledInputSize, const int lastSavedInputSize,
87d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const std::vector<int> *const sampledInputXs,
88d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const std::vector<int> *const sampledInputYs,
89e5cdd21102e4e49b18c696261a084783eb6d7e7aSatoshi Kataoka            std::vector<NearKeycodesSet> *SampledNearKeySets,
90e5aad5646309e80e1cd71533fb47a6be43f3aa2fSatoshi Kataoka            std::vector<float> *SampledDistanceCache_G);
9128c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa    static void initPrimaryInputWord(const int inputSize, const int *const inputProximities,
9228c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            int *primaryInputWord);
9328c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa    static void initNormalizedSquaredDistances(const ProximityInfo *const proximityInfo,
9428c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const int inputSize, const int *inputXCoordinates, const int *inputYCoordinates,
9528c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const int *const inputProximities, const std::vector<int> *const sampledInputXs,
9628c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const std::vector<int> *const sampledInputYs, int *normalizedSquaredDistances);
97d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka    static void dump(const bool isGeometric, const int inputSize,
98d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const int *const inputXCoordinates, const int *const inputYCoordinates,
99d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const int sampledInputSize, const std::vector<int> *const sampledInputXs,
100d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const std::vector<int> *const sampledInputYs,
101e2912d17e4dab75b81f4c9e41a539e491ac059caSatoshi Kataoka            const std::vector<int> *const sampledTimes,
102d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const std::vector<float> *const sampledSpeedRates,
103d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const std::vector<int> *const sampledBeelineSpeedPercentiles);
104394b0bd345f33b1314613a433478fd0bb711e0f7Satoshi Kataoka    static bool checkAndReturnIsContinuousSuggestionPossible(const int inputSize,
1059d18c6dd38c4d5632a5d5a5c26f567b9f6f7f969Satoshi Kataoka            const int *const xCoordinates, const int *const yCoordinates, const int *const times,
1069d18c6dd38c4d5632a5d5a5c26f567b9f6f7f969Satoshi Kataoka            const int sampledInputSize, const std::vector<int> *const sampledInputXs,
1079d18c6dd38c4d5632a5d5a5c26f567b9f6f7f969Satoshi Kataoka            const std::vector<int> *const sampledInputYs,
1089d18c6dd38c4d5632a5d5a5c26f567b9f6f7f969Satoshi Kataoka            const std::vector<int> *const sampledTimes,
1099d18c6dd38c4d5632a5d5a5c26f567b9f6f7f969Satoshi Kataoka            const std::vector<int> *const sampledInputIndices);
11020b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka    // TODO: Move to most_probable_string_utils.h
11128c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa    static float getMostProbableString(const ProximityInfo *const proximityInfo,
11228c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const int sampledInputSize,
11320b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka            const std::vector<hash_map_compat<int, float> > *const charProbabilities,
11420b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka            int *const codePointBuf);
11520b6775acc957896bdb038dfd99794d6cd7cea5aSatoshi Kataoka
11647cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka private:
11747cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka    DISALLOW_IMPLICIT_CONSTRUCTORS(ProximityInfoStateUtils);
11847cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka
11947cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka    static float updateNearKeysDistances(const ProximityInfo *const proximityInfo,
12047cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            const float maxPointToKeyLength, const int x, const int y,
121ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            NearKeysDistanceMap *const currentNearKeysDistances);
12247cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka    static bool isPrevLocalMin(const NearKeysDistanceMap *const currentNearKeysDistances,
12347cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            const NearKeysDistanceMap *const prevNearKeysDistances,
124ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const NearKeysDistanceMap *const prevPrevNearKeysDistances);
1256c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa    static float getPointScore(const int mostCommonKeyWidth, const int x, const int y,
1266c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa            const int time, const bool lastPoint, const float nearest, const float sumAngle,
1276c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa            const NearKeysDistanceMap *const currentNearKeysDistances,
12847cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            const NearKeysDistanceMap *const prevNearKeysDistances,
12947cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            const NearKeysDistanceMap *const prevPrevNearKeysDistances,
130ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs);
13128c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa    static bool pushTouchPoint(const ProximityInfo *const proximityInfo,
13228c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const int maxPointToKeyLength, const int inputIndex, const int nodeCodePoint, int x,
13328c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            int y, const int time, const bool doSampling, const bool isLastPoint,
13428c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const float sumAngle, NearKeysDistanceMap *const currentNearKeysDistances,
13547cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            const NearKeysDistanceMap *const prevNearKeysDistances,
13647cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            const NearKeysDistanceMap *const prevPrevNearKeysDistances,
13747cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs,
13847cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka            std::vector<int> *sampledInputTimes, std::vector<int> *sampledLengthCache,
139ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            std::vector<int> *sampledInputIndice);
140ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka    static float calculateBeelineSpeedRate(const int mostCommonKeyWidth, const float averageSpeed,
141ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const int id, const int inputSize, const int *const xCoordinates,
142ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const int *const yCoordinates, const int *times, const int sampledInputSize,
143ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const std::vector<int> *const sampledInputXs,
144ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const std::vector<int> *const sampledInputYs,
145ee62b78c9675bddaf2437e0cf521f6115e1d9febSatoshi Kataoka            const std::vector<int> *const inputIndice);
14628c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa    static float getPointAngle(const std::vector<int> *const sampledInputXs,
147d4828d5053ac30476b884c177235be0cac982c92Satoshi Kataoka            const std::vector<int> *const sampledInputYs, const int index);
14828c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa    static float getPointsAngle(const std::vector<int> *const sampledInputXs,
14928c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const std::vector<int> *const sampledInputYs, const int index0, const int index1,
15028c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const int index2);
151d4828d5053ac30476b884c177235be0cac982c92Satoshi Kataoka    static bool suppressCharProbabilities(const int mostCommonKeyWidth,
15228c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const int sampledInputSize, const std::vector<int> *const lengthCache, const int index0,
15328c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const int index1, std::vector<hash_map_compat<int, float> > *charProbabilities);
154d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka    static float calculateSquaredDistanceFromSweetSpotCenter(
155d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const ProximityInfo *const proximityInfo, const std::vector<int> *const sampledInputXs,
156d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const std::vector<int> *const sampledInputYs, const int keyIndex,
157d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const int inputIndex);
15828c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa     static float calculateNormalizedSquaredDistance(const ProximityInfo *const proximityInfo,
15928c008421cc5d97da8e470dbc934a2891daf9997Ken Wakasa            const std::vector<int> *const sampledInputXs,
160d7a8fbf6a9ec8828d4b6d1c615a6c605bbe5b72eSatoshi Kataoka            const std::vector<int> *const sampledInputYs, const int keyIndex, const int inputIndex);
16147cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka};
16247cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka} // namespace latinime
16347cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka#endif // LATINIME_PROXIMITY_INFO_STATE_UTILS_H
164