aboutsummaryrefslogtreecommitdiffstats
path: root/native/jni/src/proximity_info_state.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'native/jni/src/proximity_info_state.cpp')
-rw-r--r--native/jni/src/proximity_info_state.cpp319
1 files changed, 0 insertions, 319 deletions
diff --git a/native/jni/src/proximity_info_state.cpp b/native/jni/src/proximity_info_state.cpp
deleted file mode 100644
index cc5b736bd..000000000
--- a/native/jni/src/proximity_info_state.cpp
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <cstring> // for memset() and memcpy()
-#include <sstream> // for debug prints
-#include <vector>
-
-#define LOG_TAG "LatinIME: proximity_info_state.cpp"
-
-#include "defines.h"
-#include "geometry_utils.h"
-#include "proximity_info.h"
-#include "proximity_info_state.h"
-#include "proximity_info_state_utils.h"
-
-namespace latinime {
-
-// TODO: Remove the dependency of "isGeometric"
-void ProximityInfoState::initInputParams(const int pointerId, const float maxPointToKeyLength,
- const ProximityInfo *proximityInfo, const int *const inputCodes, const int inputSize,
- const int *const xCoordinates, const int *const yCoordinates, const int *const times,
- const int *const pointerIds, const bool isGeometric) {
- ASSERT(isGeometric || (inputSize < MAX_WORD_LENGTH));
- mIsContinuousSuggestionPossible =
- ProximityInfoStateUtils::checkAndReturnIsContinuousSuggestionPossible(
- inputSize, xCoordinates, yCoordinates, times, mSampledInputSize,
- &mSampledInputXs, &mSampledInputYs, &mSampledTimes, &mSampledInputIndice);
- if (DEBUG_DICT) {
- AKLOGI("isContinuousSuggestionPossible = %s",
- (mIsContinuousSuggestionPossible ? "true" : "false"));
- }
-
- mProximityInfo = proximityInfo;
- mHasTouchPositionCorrectionData = proximityInfo->hasTouchPositionCorrectionData();
- mMostCommonKeyWidthSquare = proximityInfo->getMostCommonKeyWidthSquare();
- mKeyCount = proximityInfo->getKeyCount();
- mCellHeight = proximityInfo->getCellHeight();
- mCellWidth = proximityInfo->getCellWidth();
- mGridHeight = proximityInfo->getGridWidth();
- mGridWidth = proximityInfo->getGridHeight();
-
- memset(mInputProximities, 0, sizeof(mInputProximities));
-
- if (!isGeometric && pointerId == 0) {
- mProximityInfo->initializeProximities(inputCodes, xCoordinates, yCoordinates,
- inputSize, mInputProximities);
- }
-
- ///////////////////////
- // Setup touch points
- int pushTouchPointStartIndex = 0;
- int lastSavedInputSize = 0;
- mMaxPointToKeyLength = maxPointToKeyLength;
- mSampledInputSize = 0;
- mMostProbableStringProbability = 0.0f;
-
- if (mIsContinuousSuggestionPossible && mSampledInputIndice.size() > 1) {
- // Just update difference.
- // Previous two points are never skipped. Thus, we pop 2 input point data here.
- pushTouchPointStartIndex = ProximityInfoStateUtils::trimLastTwoTouchPoints(
- &mSampledInputXs, &mSampledInputYs, &mSampledTimes, &mSampledLengthCache,
- &mSampledInputIndice);
- lastSavedInputSize = mSampledInputXs.size();
- } else {
- // Clear all data.
- mSampledInputXs.clear();
- mSampledInputYs.clear();
- mSampledTimes.clear();
- mSampledInputIndice.clear();
- mSampledLengthCache.clear();
- mSampledNormalizedSquaredLengthCache.clear();
- mSampledNearKeySets.clear();
- mSampledSearchKeySets.clear();
- mSpeedRates.clear();
- mBeelineSpeedPercentiles.clear();
- mCharProbabilities.clear();
- mDirections.clear();
- }
-
- if (DEBUG_GEO_FULL) {
- AKLOGI("Init ProximityInfoState: reused points = %d, last input size = %d",
- pushTouchPointStartIndex, lastSavedInputSize);
- }
-
- // TODO: Remove the dependency of "isGeometric"
- const float verticalSweetSpotScale = isGeometric
- ? ProximityInfoParams::VERTICAL_SWEET_SPOT_SCALE_G
- : ProximityInfoParams::VERTICAL_SWEET_SPOT_SCALE;
-
- if (xCoordinates && yCoordinates) {
- mSampledInputSize = ProximityInfoStateUtils::updateTouchPoints(mProximityInfo,
- mMaxPointToKeyLength, mInputProximities, xCoordinates, yCoordinates, times,
- pointerIds, verticalSweetSpotScale, inputSize, isGeometric, pointerId,
- pushTouchPointStartIndex, &mSampledInputXs, &mSampledInputYs, &mSampledTimes,
- &mSampledLengthCache, &mSampledInputIndice);
- }
-
- if (mSampledInputSize > 0 && isGeometric) {
- mAverageSpeed = ProximityInfoStateUtils::refreshSpeedRates(inputSize, xCoordinates,
- yCoordinates, times, lastSavedInputSize, mSampledInputSize, &mSampledInputXs,
- &mSampledInputYs, &mSampledTimes, &mSampledLengthCache, &mSampledInputIndice,
- &mSpeedRates, &mDirections);
- ProximityInfoStateUtils::refreshBeelineSpeedRates(mProximityInfo->getMostCommonKeyWidth(),
- mAverageSpeed, inputSize, xCoordinates, yCoordinates, times, mSampledInputSize,
- &mSampledInputXs, &mSampledInputYs, &mSampledInputIndice,
- &mBeelineSpeedPercentiles);
- }
-
- if (mSampledInputSize > 0) {
- ProximityInfoStateUtils::initGeometricDistanceInfos(mProximityInfo, mSampledInputSize,
- lastSavedInputSize, verticalSweetSpotScale, &mSampledInputXs, &mSampledInputYs,
- &mSampledNearKeySets, &mSampledNormalizedSquaredLengthCache);
- if (isGeometric) {
- // updates probabilities of skipping or mapping each key for all points.
- ProximityInfoStateUtils::updateAlignPointProbabilities(
- mMaxPointToKeyLength, mProximityInfo->getMostCommonKeyWidth(),
- mProximityInfo->getKeyCount(), lastSavedInputSize, mSampledInputSize,
- &mSampledInputXs, &mSampledInputYs, &mSpeedRates, &mSampledLengthCache,
- &mSampledNormalizedSquaredLengthCache, &mSampledNearKeySets,
- &mCharProbabilities);
- ProximityInfoStateUtils::updateSampledSearchKeySets(mProximityInfo,
- mSampledInputSize, lastSavedInputSize, &mSampledLengthCache,
- &mSampledNearKeySets, &mSampledSearchKeySets,
- &mSampledSearchKeyVectors);
- mMostProbableStringProbability = ProximityInfoStateUtils::getMostProbableString(
- mProximityInfo, mSampledInputSize, &mCharProbabilities, mMostProbableString);
-
- }
- }
-
- if (DEBUG_SAMPLING_POINTS) {
- ProximityInfoStateUtils::dump(isGeometric, inputSize, xCoordinates, yCoordinates,
- mSampledInputSize, &mSampledInputXs, &mSampledInputYs, &mSampledTimes, &mSpeedRates,
- &mBeelineSpeedPercentiles);
- }
- // end
- ///////////////////////
-
- mTouchPositionCorrectionEnabled = mSampledInputSize > 0 && mHasTouchPositionCorrectionData
- && xCoordinates && yCoordinates;
- if (!isGeometric && pointerId == 0) {
- ProximityInfoStateUtils::initPrimaryInputWord(
- inputSize, mInputProximities, mPrimaryInputWord);
- if (mTouchPositionCorrectionEnabled) {
- ProximityInfoStateUtils::initNormalizedSquaredDistances(
- mProximityInfo, inputSize, xCoordinates, yCoordinates, mInputProximities,
- &mSampledInputXs, &mSampledInputYs, mNormalizedSquaredDistances);
- }
- }
- if (DEBUG_GEO_FULL) {
- AKLOGI("ProximityState init finished: %d points out of %d", mSampledInputSize, inputSize);
- }
-}
-
-// This function basically converts from a length to an edit distance. Accordingly, it's obviously
-// wrong to compare with mMaxPointToKeyLength.
-float ProximityInfoState::getPointToKeyLength(
- const int inputIndex, const int codePoint) const {
- const int keyId = mProximityInfo->getKeyIndexOf(codePoint);
- if (keyId != NOT_AN_INDEX) {
- const int index = inputIndex * mProximityInfo->getKeyCount() + keyId;
- return min(mSampledNormalizedSquaredLengthCache[index], mMaxPointToKeyLength);
- }
- if (isIntentionalOmissionCodePoint(codePoint)) {
- return 0.0f;
- }
- // If the char is not a key on the keyboard then return the max length.
- return static_cast<float>(MAX_VALUE_FOR_WEIGHTING);
-}
-
-float ProximityInfoState::getPointToKeyByIdLength(
- const int inputIndex, const int keyId) const {
- return ProximityInfoStateUtils::getPointToKeyByIdLength(mMaxPointToKeyLength,
- &mSampledNormalizedSquaredLengthCache, mProximityInfo->getKeyCount(), inputIndex,
- keyId);
-}
-
-// In the following function, c is the current character of the dictionary word currently examined.
-// currentChars is an array containing the keys close to the character the user actually typed at
-// the same position. We want to see if c is in it: if so, then the word contains at that position
-// a character close to what the user typed.
-// What the user typed is actually the first character of the array.
-// proximityIndex is a pointer to the variable where getProximityType returns the index of c
-// in the proximity chars of the input index.
-// Notice : accented characters do not have a proximity list, so they are alone in their list. The
-// non-accented version of the character should be considered "close", but not the other keys close
-// to the non-accented version.
-ProximityType ProximityInfoState::getProximityType(const int index, const int codePoint,
- const bool checkProximityChars, int *proximityIndex) const {
- const int *currentCodePoints = getProximityCodePointsAt(index);
- const int firstCodePoint = currentCodePoints[0];
- const int baseLowerC = toBaseLowerCase(codePoint);
-
- // The first char in the array is what user typed. If it matches right away, that means the
- // user typed that same char for this pos.
- if (firstCodePoint == baseLowerC || firstCodePoint == codePoint) {
- return MATCH_CHAR;
- }
-
- if (!checkProximityChars) return SUBSTITUTION_CHAR;
-
- // If the non-accented, lowercased version of that first character matches c, then we have a
- // non-accented version of the accented character the user typed. Treat it as a close char.
- if (toBaseLowerCase(firstCodePoint) == baseLowerC) {
- return PROXIMITY_CHAR;
- }
-
- // Not an exact nor an accent-alike match: search the list of close keys
- int j = 1;
- while (j < MAX_PROXIMITY_CHARS_SIZE
- && currentCodePoints[j] > ADDITIONAL_PROXIMITY_CHAR_DELIMITER_CODE) {
- const bool matched = (currentCodePoints[j] == baseLowerC
- || currentCodePoints[j] == codePoint);
- if (matched) {
- if (proximityIndex) {
- *proximityIndex = j;
- }
- return PROXIMITY_CHAR;
- }
- ++j;
- }
- if (j < MAX_PROXIMITY_CHARS_SIZE
- && currentCodePoints[j] == ADDITIONAL_PROXIMITY_CHAR_DELIMITER_CODE) {
- ++j;
- while (j < MAX_PROXIMITY_CHARS_SIZE
- && currentCodePoints[j] > ADDITIONAL_PROXIMITY_CHAR_DELIMITER_CODE) {
- const bool matched = (currentCodePoints[j] == baseLowerC
- || currentCodePoints[j] == codePoint);
- if (matched) {
- if (proximityIndex) {
- *proximityIndex = j;
- }
- return ADDITIONAL_PROXIMITY_CHAR;
- }
- ++j;
- }
- }
- // Was not included, signal this as a substitution character.
- return SUBSTITUTION_CHAR;
-}
-
-ProximityType ProximityInfoState::getProximityTypeG(const int index, const int codePoint) const {
- if (!isUsed()) {
- return UNRELATED_CHAR;
- }
- const int lowerCodePoint = toLowerCase(codePoint);
- const int baseLowerCodePoint = toBaseCodePoint(lowerCodePoint);
- for (int i = 0; i < static_cast<int>(mSampledSearchKeyVectors[index].size()); ++i) {
- if (mSampledSearchKeyVectors[index][i] == lowerCodePoint
- || mSampledSearchKeyVectors[index][i] == baseLowerCodePoint) {
- return MATCH_CHAR;
- }
- }
- return UNRELATED_CHAR;
-}
-
-bool ProximityInfoState::isKeyInSerchKeysAfterIndex(const int index, const int keyId) const {
- ASSERT(keyId >= 0 && index >= 0 && index < mSampledInputSize);
- return mSampledSearchKeySets[index].test(keyId);
-}
-
-float ProximityInfoState::getDirection(const int index0, const int index1) const {
- return ProximityInfoStateUtils::getDirection(
- &mSampledInputXs, &mSampledInputYs, index0, index1);
-}
-
-float ProximityInfoState::getLineToKeyDistance(
- const int from, const int to, const int keyId, const bool extend) const {
- if (from < 0 || from > mSampledInputSize - 1) {
- return 0.0f;
- }
- if (to < 0 || to > mSampledInputSize - 1) {
- return 0.0f;
- }
- const int x0 = mSampledInputXs[from];
- const int y0 = mSampledInputYs[from];
- const int x1 = mSampledInputXs[to];
- const int y1 = mSampledInputYs[to];
-
- const int keyX = mProximityInfo->getKeyCenterXOfKeyIdG(keyId);
- const int keyY = mProximityInfo->getKeyCenterYOfKeyIdG(keyId);
-
- return ProximityInfoUtils::pointToLineSegSquaredDistanceFloat(
- keyX, keyY, x0, y0, x1, y1, extend);
-}
-
-float ProximityInfoState::getMostProbableString(int *const codePointBuf) const {
- memcpy(codePointBuf, mMostProbableString, sizeof(mMostProbableString));
- return mMostProbableStringProbability;
-}
-
-bool ProximityInfoState::hasSpaceProximity(const int index) const {
- ASSERT(0 <= index && index < mSampledInputSize);
- return mProximityInfo->hasSpaceProximity(getInputX(index), getInputY(index));
-}
-
-// Returns a probability of mapping index to keyIndex.
-float ProximityInfoState::getProbability(const int index, const int keyIndex) const {
- ASSERT(0 <= index && index < mSampledInputSize);
- hash_map_compat<int, float>::const_iterator it = mCharProbabilities[index].find(keyIndex);
- if (it != mCharProbabilities[index].end()) {
- return it->second;
- }
- return static_cast<float>(MAX_VALUE_FOR_WEIGHTING);
-}
-} // namespace latinime