proximity_info_state_utils.h revision d4828d5053ac30476b884c177235be0cac982c92
1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu/*
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu * Copyright (C) 2013 The Android Open Source Project
3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu *
4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu * Licensed under the Apache License, Version 2.0 (the "License");
5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu * you may not use this file except in compliance with the License.
6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu * You may obtain a copy of the License at
7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu *
8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu *      http://www.apache.org/licenses/LICENSE-2.0
9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu *
10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu * Unless required by applicable law or agreed to in writing, software
11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu * distributed under the License is distributed on an "AS IS" BASIS,
12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu * See the License for the specific language governing permissions and
14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu * limitations under the License.
15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu */
1650308cd0cc10594b9f50fc4191ba4e9bd1fec0e5Darin Petkov
17675d0b0f04936050a357722f52dc078a3ab671d8Peter Qiu#ifndef LATINIME_PROXIMITY_INFO_STATE_UTILS_H
18675d0b0f04936050a357722f52dc078a3ab671d8Peter Qiu#define LATINIME_PROXIMITY_INFO_STATE_UTILS_H
1950308cd0cc10594b9f50fc4191ba4e9bd1fec0e5Darin Petkov
208a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <bitset>
21cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan#include <vector>
228a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko
238e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu#include "defines.h"
248a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include "hash_map_compat.h"
25cc0fded2a80c2c6c7fb46cbd7eee578e7a78c50amukesh agrawal
26a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Channamespace latinime {
27cc0fded2a80c2c6c7fb46cbd7eee578e7a78c50amukesh agrawalclass ProximityInfo;
28e7cb7f8e7cab7b8cf91064e3dfa5ad75fc376d48Darin Petkovclass ProximityInfoParams;
29d1b715b403e17f4ce01ec15877ea1901fc21a885Darin Petkov
3050308cd0cc10594b9f50fc4191ba4e9bd1fec0e5Darin Petkovclass ProximityInfoStateUtils {
317adad988e41954c134cbb4e5ab8a1a152e1e3c78Peter Qiu public:
3250308cd0cc10594b9f50fc4191ba4e9bd1fec0e5Darin Petkov    typedef hash_map_compat<int, float> NearKeysDistanceMap;
3350308cd0cc10594b9f50fc4191ba4e9bd1fec0e5Darin Petkov    typedef std::bitset<MAX_KEY_COUNT_IN_A_KEYBOARD> NearKeycodesSet;
3450308cd0cc10594b9f50fc4191ba4e9bd1fec0e5Darin Petkov
3519e30406a1d3123892007d20438527dc4b2f92c3Chris Masone    static int updateTouchPoints(const int mostCommonKeyWidth,
36d1b715b403e17f4ce01ec15877ea1901fc21a885Darin Petkov            const ProximityInfo *const proximityInfo, const int maxPointToKeyLength,
37d1b715b403e17f4ce01ec15877ea1901fc21a885Darin Petkov            const int *const inputProximities,
38a7b8949f39e8c2ae2324dda16b9aa121cc3f7e8fDarin Petkov            const int *const inputXCoordinates, const int *const inputYCoordinates,
393bdf1abfba480415a4714108e615649f422197e0Paul Stewart            const int *const times, const int *const pointerIds, const int inputSize,
408ee1c83abf0050cb808fe154babe934546e77821Peter Qiu            const bool isGeometric, const int pointerId, const int pushTouchPointStartIndex,
41d1b715b403e17f4ce01ec15877ea1901fc21a885Darin Petkov            std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs,
42d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart            std::vector<int> *sampledInputTimes, std::vector<int> *sampledLengthCache,
43d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart            std::vector<int> *sampledInputIndice);
44d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart    static const int *getProximityCodePointsAt(const int *const inputProximities, const int index);
45d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart    static int getPrimaryCodePointAt(const int *const inputProximities, const int index);
46d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart    static void popInputData(std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs,
47d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart            std::vector<int> *sampledInputTimes, std::vector<int> *sampledLengthCache,
48d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart            std::vector<int> *sampledInputIndice);
499a24553461df7036755060423f90804011612249Eric Shienbrood    static float refreshSpeedRates(const int inputSize, const int *const xCoordinates,
5050308cd0cc10594b9f50fc4191ba4e9bd1fec0e5Darin Petkov            const int *const yCoordinates, const int *const times, const int lastSavedInputSize,
510bfabaae654ba3bf597a303b7517a0e14fd65089Paul Stewart            const int sampledInputSize, const std::vector<int> *const sampledInputXs,
520bfabaae654ba3bf597a303b7517a0e14fd65089Paul Stewart            const std::vector<int> *const sampledInputYs,
530bfabaae654ba3bf597a303b7517a0e14fd65089Paul Stewart            const std::vector<int> *const sampledInputTimes,
540bfabaae654ba3bf597a303b7517a0e14fd65089Paul Stewart            const std::vector<int> *const sampledLengthCache,
550bfabaae654ba3bf597a303b7517a0e14fd65089Paul Stewart            const std::vector<int> *const sampledInputIndice,
568ee1c83abf0050cb808fe154babe934546e77821Peter Qiu            std::vector<float> *sampledSpeedRates, std::vector<float> *sampledDirections);
575ea763b83299b5fad76a87183fb39a74c2d3c61dBen Chan    static void refreshBeelineSpeedRates(const int mostCommonKeyWidth,  const float averageSpeed,
5850308cd0cc10594b9f50fc4191ba4e9bd1fec0e5Darin Petkov            const int inputSize, const int *const xCoordinates, const int *const yCoordinates,
59d1b715b403e17f4ce01ec15877ea1901fc21a885Darin Petkov            const int *times, const int sampledInputSize,
606acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang            const std::vector<int> *const sampledInputXs,
616acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang            const std::vector<int> *const sampledInputYs, const std::vector<int> *const inputIndice,
626acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang            std::vector<int> *beelineSpeedPercentiles);
63d1b715b403e17f4ce01ec15877ea1901fc21a885Darin Petkov    static float getDirection(const std::vector<int> *const sampledInputXs,
64d1b715b403e17f4ce01ec15877ea1901fc21a885Darin Petkov            const std::vector<int> *const sampledInputYs, const int index0, const int index1);
65d1b715b403e17f4ce01ec15877ea1901fc21a885Darin Petkov    static void updateAlignPointProbabilities(
660bfabaae654ba3bf597a303b7517a0e14fd65089Paul Stewart            const float maxPointToKeyLength, const int mostCommonKeyWidth, const int keyCount,
67d1b715b403e17f4ce01ec15877ea1901fc21a885Darin Petkov            const int start, const int sampledInputSize,
68e7cb7f8e7cab7b8cf91064e3dfa5ad75fc376d48Darin Petkov            const std::vector<int> *const sampledInputXs,
690bfabaae654ba3bf597a303b7517a0e14fd65089Paul Stewart            const std::vector<int> *const sampledInputYs,
707adad988e41954c134cbb4e5ab8a1a152e1e3c78Peter Qiu            const std::vector<float> *const sampledSpeedRates,
71e7cb7f8e7cab7b8cf91064e3dfa5ad75fc376d48Darin Petkov            const std::vector<int> *const sampledLengthCache,
723bdf1abfba480415a4714108e615649f422197e0Paul Stewart            const std::vector<float> *const distanceCache_G,
730bfabaae654ba3bf597a303b7517a0e14fd65089Paul Stewart            std::vector<NearKeycodesSet> *nearKeysVector,
743bdf1abfba480415a4714108e615649f422197e0Paul Stewart            std::vector<hash_map_compat<int, float> > *charProbabilities);
75782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly    static float getPointToKeyByIdLength(const float maxPointToKeyLength,
76782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly            const std::vector<float> *const distanceCache_G, const int keyCount,
77782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly            const int inputIndex, const int keyId, const float scale);
78782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly    static float getPointToKeyByIdLength(const float maxPointToKeyLength,
79782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly            const std::vector<float> *const distanceCache_G, const int keyCount,
80cc0fded2a80c2c6c7fb46cbd7eee578e7a78c50amukesh agrawal            const int inputIndex, const int keyId);
81cc0fded2a80c2c6c7fb46cbd7eee578e7a78c50amukesh agrawal
820bfabaae654ba3bf597a303b7517a0e14fd65089Paul Stewart private:
836acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang    DISALLOW_IMPLICIT_CONSTRUCTORS(ProximityInfoStateUtils);
846acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang
85cc0fded2a80c2c6c7fb46cbd7eee578e7a78c50amukesh agrawal    static float updateNearKeysDistances(const ProximityInfo *const proximityInfo,
868e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            const float maxPointToKeyLength, const int x, const int y,
878e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            NearKeysDistanceMap *const currentNearKeysDistances);
888e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu    static bool isPrevLocalMin(const NearKeysDistanceMap *const currentNearKeysDistances,
898e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            const NearKeysDistanceMap *const prevNearKeysDistances,
908e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            const NearKeysDistanceMap *const prevPrevNearKeysDistances);
918e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu    static float getPointScore(const int mostCommonKeyWidth, const int x, const int y,
928e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            const int time, const bool lastPoint, const float nearest, const float sumAngle,
938e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            const NearKeysDistanceMap *const currentNearKeysDistances,
948e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            const NearKeysDistanceMap *const prevNearKeysDistances,
958e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            const NearKeysDistanceMap *const prevPrevNearKeysDistances,
968e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs);
978e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu    static bool pushTouchPoint(const int mostCommonKeyWidth,
988e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            const ProximityInfo *const proximityInfo, const int maxPointToKeyLength,
998e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            const int inputIndex, const int nodeCodePoint, int x, int y, const int time,
1008e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            const bool doSampling, const bool isLastPoint, const float sumAngle,
1018e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            NearKeysDistanceMap *const currentNearKeysDistances,
1028e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            const NearKeysDistanceMap *const prevNearKeysDistances,
1038e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            const NearKeysDistanceMap *const prevPrevNearKeysDistances,
1048e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs,
1058e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            std::vector<int> *sampledInputTimes, std::vector<int> *sampledLengthCache,
1068e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            std::vector<int> *sampledInputIndice);
1078e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu    static float calculateBeelineSpeedRate(const int mostCommonKeyWidth, const float averageSpeed,
1088e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            const int id, const int inputSize, const int *const xCoordinates,
1098e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            const int *const yCoordinates, const int *times, const int sampledInputSize,
1108e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            const std::vector<int> *const sampledInputXs,
1118e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            const std::vector<int> *const sampledInputYs,
11250308cd0cc10594b9f50fc4191ba4e9bd1fec0e5Darin Petkov            const std::vector<int> *const inputIndice);
11398dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkov    static float getPointAngle(
1148e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            const std::vector<int> *const sampledInputXs,
115b255a76b77bbe54ed0ed8b50ba05a959acfda180Peter Qiu            const std::vector<int> *const sampledInputYs, const int index);
1168e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu    static float getPointsAngle(
1178e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            const std::vector<int> *const sampledInputXs,
118c5099532b82fe201fe2510c43b529944a0930d2ePaul Stewart            const std::vector<int> *const sampledInputYs,
119c5099532b82fe201fe2510c43b529944a0930d2ePaul Stewart            const int index0, const int index1, const int index2);
120475c072d0354b7d6856dca6e329571de08454f36Paul Stewart    static bool suppressCharProbabilities(const int mostCommonKeyWidth,
121475c072d0354b7d6856dca6e329571de08454f36Paul Stewart            const int sampledInputSize, const std::vector<int> *const lengthCache,
122a7b8949f39e8c2ae2324dda16b9aa121cc3f7e8fDarin Petkov            const int index0, const int index1,
1238e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu            std::vector<hash_map_compat<int, float> > *charProbabilities);
12498dd6a0c9facbd208c6f08ad4150f7d384a8a5eaDarin Petkov};
125217c61dfafa2ddc800daa227d032d84daf668382Paul Stewart} // namespace latinime
126217c61dfafa2ddc800daa227d032d84daf668382Paul Stewart#endif // LATINIME_PROXIMITY_INFO_STATE_UTILS_H
1278e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu