Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef LATINIME_PROXIMITY_INFO_STATE_UTILS_H
     18 #define LATINIME_PROXIMITY_INFO_STATE_UTILS_H
     19 
     20 #include <bitset>
     21 #include <vector>
     22 
     23 #include "defines.h"
     24 #include "hash_map_compat.h"
     25 
     26 namespace latinime {
     27 class ProximityInfo;
     28 class ProximityInfoParams;
     29 
     30 class ProximityInfoStateUtils {
     31  public:
     32     typedef hash_map_compat<int, float> NearKeysDistanceMap;
     33     typedef std::bitset<MAX_KEY_COUNT_IN_A_KEYBOARD> NearKeycodesSet;
     34 
     35     static int trimLastTwoTouchPoints(std::vector<int> *sampledInputXs,
     36             std::vector<int> *sampledInputYs, std::vector<int> *sampledInputTimes,
     37             std::vector<int> *sampledLengthCache, std::vector<int> *sampledInputIndice);
     38     static int updateTouchPoints(const ProximityInfo *const proximityInfo,
     39             const int maxPointToKeyLength, const int *const inputProximities,
     40             const int *const inputXCoordinates, const int *const inputYCoordinates,
     41             const int *const times, const int *const pointerIds,
     42             const float verticalSweetSpotScale, const int inputSize,
     43             const bool isGeometric, const int pointerId, const int pushTouchPointStartIndex,
     44             std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs,
     45             std::vector<int> *sampledInputTimes, std::vector<int> *sampledLengthCache,
     46             std::vector<int> *sampledInputIndice);
     47     static const int *getProximityCodePointsAt(const int *const inputProximities, const int index);
     48     static int getPrimaryCodePointAt(const int *const inputProximities, const int index);
     49     static void popInputData(std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs,
     50             std::vector<int> *sampledInputTimes, std::vector<int> *sampledLengthCache,
     51             std::vector<int> *sampledInputIndice);
     52     static float refreshSpeedRates(const int inputSize, const int *const xCoordinates,
     53             const int *const yCoordinates, const int *const times, const int lastSavedInputSize,
     54             const int sampledInputSize, const std::vector<int> *const sampledInputXs,
     55             const std::vector<int> *const sampledInputYs,
     56             const std::vector<int> *const sampledInputTimes,
     57             const std::vector<int> *const sampledLengthCache,
     58             const std::vector<int> *const sampledInputIndice,
     59             std::vector<float> *sampledSpeedRates, std::vector<float> *sampledDirections);
     60     static void refreshBeelineSpeedRates(const int mostCommonKeyWidth,  const float averageSpeed,
     61             const int inputSize, const int *const xCoordinates, const int *const yCoordinates,
     62             const int *times, const int sampledInputSize,
     63             const std::vector<int> *const sampledInputXs,
     64             const std::vector<int> *const sampledInputYs, const std::vector<int> *const inputIndice,
     65             std::vector<int> *beelineSpeedPercentiles);
     66     static float getDirection(const std::vector<int> *const sampledInputXs,
     67             const std::vector<int> *const sampledInputYs, const int index0, const int index1);
     68     static void updateAlignPointProbabilities(const float maxPointToKeyLength,
     69             const int mostCommonKeyWidth, const int keyCount, const int start,
     70             const int sampledInputSize, const std::vector<int> *const sampledInputXs,
     71             const std::vector<int> *const sampledInputYs,
     72             const std::vector<float> *const sampledSpeedRates,
     73             const std::vector<int> *const sampledLengthCache,
     74             const std::vector<float> *const sampledNormalizedSquaredLengthCache,
     75             std::vector<NearKeycodesSet> *sampledNearKeySets,
     76             std::vector<hash_map_compat<int, float> > *charProbabilities);
     77     static void updateSampledSearchKeySets(const ProximityInfo *const proximityInfo,
     78             const int sampledInputSize, const int lastSavedInputSize,
     79             const std::vector<int> *const sampledLengthCache,
     80             const std::vector<NearKeycodesSet> *const sampledNearKeySets,
     81             std::vector<NearKeycodesSet> *sampledSearchKeySets,
     82             std::vector<std::vector<int> > *sampledSearchKeyVectors);
     83     static float getPointToKeyByIdLength(const float maxPointToKeyLength,
     84             const std::vector<float> *const sampledNormalizedSquaredLengthCache, const int keyCount,
     85             const int inputIndex, const int keyId);
     86     static void initGeometricDistanceInfos(const ProximityInfo *const proximityInfo,
     87             const int sampledInputSize, const int lastSavedInputSize,
     88             const float verticalSweetSpotScale,
     89             const std::vector<int> *const sampledInputXs,
     90             const std::vector<int> *const sampledInputYs,
     91             std::vector<NearKeycodesSet> *sampledNearKeySets,
     92             std::vector<float> *sampledNormalizedSquaredLengthCache);
     93     static void initPrimaryInputWord(const int inputSize, const int *const inputProximities,
     94             int *primaryInputWord);
     95     static void initNormalizedSquaredDistances(const ProximityInfo *const proximityInfo,
     96             const int inputSize, const int *inputXCoordinates, const int *inputYCoordinates,
     97             const int *const inputProximities, const std::vector<int> *const sampledInputXs,
     98             const std::vector<int> *const sampledInputYs, int *normalizedSquaredDistances);
     99     static void dump(const bool isGeometric, const int inputSize,
    100             const int *const inputXCoordinates, const int *const inputYCoordinates,
    101             const int sampledInputSize, const std::vector<int> *const sampledInputXs,
    102             const std::vector<int> *const sampledInputYs,
    103             const std::vector<int> *const sampledTimes,
    104             const std::vector<float> *const sampledSpeedRates,
    105             const std::vector<int> *const sampledBeelineSpeedPercentiles);
    106     static bool checkAndReturnIsContinuousSuggestionPossible(const int inputSize,
    107             const int *const xCoordinates, const int *const yCoordinates, const int *const times,
    108             const int sampledInputSize, const std::vector<int> *const sampledInputXs,
    109             const std::vector<int> *const sampledInputYs,
    110             const std::vector<int> *const sampledTimes,
    111             const std::vector<int> *const sampledInputIndices);
    112     // TODO: Move to most_probable_string_utils.h
    113     static float getMostProbableString(const ProximityInfo *const proximityInfo,
    114             const int sampledInputSize,
    115             const std::vector<hash_map_compat<int, float> > *const charProbabilities,
    116             int *const codePointBuf);
    117 
    118  private:
    119     DISALLOW_IMPLICIT_CONSTRUCTORS(ProximityInfoStateUtils);
    120 
    121     static float updateNearKeysDistances(const ProximityInfo *const proximityInfo,
    122             const float maxPointToKeyLength, const int x, const int y,
    123             const float verticalSweetSpotScale,
    124             NearKeysDistanceMap *const currentNearKeysDistances);
    125     static bool isPrevLocalMin(const NearKeysDistanceMap *const currentNearKeysDistances,
    126             const NearKeysDistanceMap *const prevNearKeysDistances,
    127             const NearKeysDistanceMap *const prevPrevNearKeysDistances);
    128     static float getPointScore(const int mostCommonKeyWidth, const int x, const int y,
    129             const int time, const bool lastPoint, const float nearest, const float sumAngle,
    130             const NearKeysDistanceMap *const currentNearKeysDistances,
    131             const NearKeysDistanceMap *const prevNearKeysDistances,
    132             const NearKeysDistanceMap *const prevPrevNearKeysDistances,
    133             std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs);
    134     static bool pushTouchPoint(const ProximityInfo *const proximityInfo,
    135             const int maxPointToKeyLength, const int inputIndex, const int nodeCodePoint, int x,
    136             int y, const int time, const float verticalSweetSpotScale,
    137             const bool doSampling, const bool isLastPoint,
    138             const float sumAngle, NearKeysDistanceMap *const currentNearKeysDistances,
    139             const NearKeysDistanceMap *const prevNearKeysDistances,
    140             const NearKeysDistanceMap *const prevPrevNearKeysDistances,
    141             std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs,
    142             std::vector<int> *sampledInputTimes, std::vector<int> *sampledLengthCache,
    143             std::vector<int> *sampledInputIndice);
    144     static float calculateBeelineSpeedRate(const int mostCommonKeyWidth, const float averageSpeed,
    145             const int id, const int inputSize, const int *const xCoordinates,
    146             const int *const yCoordinates, const int *times, const int sampledInputSize,
    147             const std::vector<int> *const sampledInputXs,
    148             const std::vector<int> *const sampledInputYs,
    149             const std::vector<int> *const inputIndice);
    150     static float getPointAngle(const std::vector<int> *const sampledInputXs,
    151             const std::vector<int> *const sampledInputYs, const int index);
    152     static float getPointsAngle(const std::vector<int> *const sampledInputXs,
    153             const std::vector<int> *const sampledInputYs, const int index0, const int index1,
    154             const int index2);
    155     static bool suppressCharProbabilities(const int mostCommonKeyWidth,
    156             const int sampledInputSize, const std::vector<int> *const lengthCache, const int index0,
    157             const int index1, std::vector<hash_map_compat<int, float> > *charProbabilities);
    158     static float calculateSquaredDistanceFromSweetSpotCenter(
    159             const ProximityInfo *const proximityInfo, const std::vector<int> *const sampledInputXs,
    160             const std::vector<int> *const sampledInputYs, const int keyIndex,
    161             const int inputIndex);
    162      static float calculateNormalizedSquaredDistance(const ProximityInfo *const proximityInfo,
    163             const std::vector<int> *const sampledInputXs,
    164             const std::vector<int> *const sampledInputYs, const int keyIndex, const int inputIndex);
    165 };
    166 } // namespace latinime
    167 #endif // LATINIME_PROXIMITY_INFO_STATE_UTILS_H
    168