aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeisuke Kuroyanagi <ksk@google.com>2014-04-07 19:02:56 +0900
committerKeisuke Kuroyanagi <ksk@google.com>2014-04-09 16:50:31 +0900
commitbc9500fb14622f8b185e30a10a7c0b4c5a29930a (patch)
tree870da492dff08fb472a3b075bd754beef72dc77f
parent26c806620c26e048918624367ee624526613b0d2 (diff)
downloadlatinime-bc9500fb14622f8b185e30a10a7c0b4c5a29930a.tar.gz
latinime-bc9500fb14622f8b185e30a10a7c0b4c5a29930a.tar.xz
latinime-bc9500fb14622f8b185e30a10a7c0b4c5a29930a.zip
Quit limiting gesture search space by distance.
Before: (0) 470.00 (8.25%) (1) 5160.00 (90.53%) (2) 50.00 (0.88%) (66) 10.00 (0.18%) Total 5700.00 (sum of others 5690.00) After: (0) 670.00 (10.52%) (1) 5530.00 (86.81%) (2) 120.00 (1.88%) Total 6370.00 (sum of others 6320.00) Bug: 13773693 Bug: 10701902 Bug: 9505397 Change-Id: Ie168ac4ae0ca0e954512b08e3cc0f6399a3c163d
-rw-r--r--native/jni/src/suggest/core/layout/proximity_info_params.cpp5
-rw-r--r--native/jni/src/suggest/core/layout/proximity_info_params.h3
-rw-r--r--native/jni/src/suggest/core/layout/proximity_info_state.cpp8
-rw-r--r--native/jni/src/suggest/core/layout/proximity_info_state.h10
-rw-r--r--native/jni/src/suggest/core/layout/proximity_info_state_utils.cpp63
-rw-r--r--native/jni/src/suggest/core/layout/proximity_info_state_utils.h4
6 files changed, 34 insertions, 59 deletions
diff --git a/native/jni/src/suggest/core/layout/proximity_info_params.cpp b/native/jni/src/suggest/core/layout/proximity_info_params.cpp
index a70dd7e34..68bb0ae9d 100644
--- a/native/jni/src/suggest/core/layout/proximity_info_params.cpp
+++ b/native/jni/src/suggest/core/layout/proximity_info_params.cpp
@@ -24,9 +24,6 @@ const float ProximityInfoParams::VERTICAL_SWEET_SPOT_SCALE = 1.0f;
const float ProximityInfoParams::VERTICAL_SWEET_SPOT_SCALE_G = 0.5f;
/* Per method constants */
-// Used by ProximityInfoStateUtils::initGeometricDistanceInfos()
-const float ProximityInfoParams::NEAR_KEY_NORMALIZED_SQUARED_THRESHOLD = 4.0f;
-
// Used by ProximityInfoStateUtils::updateNearKeysDistances()
const float ProximityInfoParams::NEAR_KEY_THRESHOLD_FOR_DISTANCE = 2.0f;
@@ -50,7 +47,7 @@ const int ProximityInfoParams::NUM_POINTS_FOR_SPEED_CALCULATION = 2;
const int ProximityInfoParams::LAST_POINT_SKIP_DISTANCE_SCALE = 4;
// Used by ProximityInfoStateUtils::updateAlignPointProbabilities()
-const float ProximityInfoParams::MIN_PROBABILITY = 0.000001f;
+const float ProximityInfoParams::MIN_PROBABILITY = 0.000005f;
const float ProximityInfoParams::MAX_SKIP_PROBABILITY = 0.95f;
const float ProximityInfoParams::SKIP_FIRST_POINT_PROBABILITY = 0.01f;
const float ProximityInfoParams::SKIP_LAST_POINT_PROBABILITY = 0.1f;
diff --git a/native/jni/src/suggest/core/layout/proximity_info_params.h b/native/jni/src/suggest/core/layout/proximity_info_params.h
index b8e9f5daf..d9515c837 100644
--- a/native/jni/src/suggest/core/layout/proximity_info_params.h
+++ b/native/jni/src/suggest/core/layout/proximity_info_params.h
@@ -28,9 +28,6 @@ class ProximityInfoParams {
static const float VERTICAL_SWEET_SPOT_SCALE;
static const float VERTICAL_SWEET_SPOT_SCALE_G;
- // Used by ProximityInfoStateUtils::initGeometricDistanceInfos()
- static const float NEAR_KEY_NORMALIZED_SQUARED_THRESHOLD;
-
// Used by ProximityInfoStateUtils::updateNearKeysDistances()
static const float NEAR_KEY_THRESHOLD_FOR_DISTANCE;
diff --git a/native/jni/src/suggest/core/layout/proximity_info_state.cpp b/native/jni/src/suggest/core/layout/proximity_info_state.cpp
index b75c2ef67..e585f9088 100644
--- a/native/jni/src/suggest/core/layout/proximity_info_state.cpp
+++ b/native/jni/src/suggest/core/layout/proximity_info_state.cpp
@@ -91,7 +91,6 @@ void ProximityInfoState::initInputParams(const int pointerId, const float maxPoi
mSampledInputIndice.clear();
mSampledLengthCache.clear();
mSampledNormalizedSquaredLengthCache.clear();
- mSampledNearKeySets.clear();
mSampledSearchKeySets.clear();
mSpeedRates.clear();
mBeelineSpeedPercentiles.clear();
@@ -126,18 +125,17 @@ void ProximityInfoState::initInputParams(const int pointerId, const float maxPoi
if (mSampledInputSize > 0) {
ProximityInfoStateUtils::initGeometricDistanceInfos(mProximityInfo, mSampledInputSize,
lastSavedInputSize, isGeometric, &mSampledInputXs, &mSampledInputYs,
- &mSampledNearKeySets, &mSampledNormalizedSquaredLengthCache);
+ &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,
- mProximityInfo, &mCharProbabilities);
+ &mSampledNormalizedSquaredLengthCache, mProximityInfo, &mCharProbabilities);
ProximityInfoStateUtils::updateSampledSearchKeySets(mProximityInfo,
mSampledInputSize, lastSavedInputSize, &mSampledLengthCache,
- &mSampledNearKeySets, &mSampledSearchKeySets,
+ &mCharProbabilities, &mSampledSearchKeySets,
&mSampledSearchKeyVectors);
mMostProbableStringProbability = ProximityInfoStateUtils::getMostProbableString(
mProximityInfo, mSampledInputSize, &mCharProbabilities, mMostProbableString);
diff --git a/native/jni/src/suggest/core/layout/proximity_info_state.h b/native/jni/src/suggest/core/layout/proximity_info_state.h
index e253d9550..d66121b74 100644
--- a/native/jni/src/suggest/core/layout/proximity_info_state.h
+++ b/native/jni/src/suggest/core/layout/proximity_info_state.h
@@ -50,9 +50,9 @@ class ProximityInfoState {
mSampledInputXs(), mSampledInputYs(), mSampledTimes(), mSampledInputIndice(),
mSampledLengthCache(), mBeelineSpeedPercentiles(),
mSampledNormalizedSquaredLengthCache(), mSpeedRates(), mDirections(),
- mCharProbabilities(), mSampledNearKeySets(), mSampledSearchKeySets(),
- mSampledSearchKeyVectors(), mTouchPositionCorrectionEnabled(false),
- mSampledInputSize(0), mMostProbableStringProbability(0.0f) {
+ mCharProbabilities(), mSampledSearchKeySets(), mSampledSearchKeyVectors(),
+ mTouchPositionCorrectionEnabled(false), mSampledInputSize(0),
+ mMostProbableStringProbability(0.0f) {
memset(mInputProximities, 0, sizeof(mInputProximities));
memset(mPrimaryInputWord, 0, sizeof(mPrimaryInputWord));
memset(mMostProbableString, 0, sizeof(mMostProbableString));
@@ -216,10 +216,6 @@ class ProximityInfoState {
std::vector<float> mDirections;
// probabilities of skipping or mapping to a key for each point.
std::vector<hash_map_compat<int, float> > mCharProbabilities;
- // The vector for the key code set which holds nearby keys for each sampled input point
- // 1. Used to calculate the probability of the key
- // 2. Used to calculate mSampledSearchKeySets
- std::vector<ProximityInfoStateUtils::NearKeycodesSet> mSampledNearKeySets;
// The vector for the key code set which holds nearby keys of some trailing sampled input points
// for each sampled input point. These nearby keys contain the next characters which can be in
// the dictionary. Specifically, currently we are looking for keys nearby trailing sampled
diff --git a/native/jni/src/suggest/core/layout/proximity_info_state_utils.cpp b/native/jni/src/suggest/core/layout/proximity_info_state_utils.cpp
index 638297eb1..72bb68fc4 100644
--- a/native/jni/src/suggest/core/layout/proximity_info_state_utils.cpp
+++ b/native/jni/src/suggest/core/layout/proximity_info_state_utils.cpp
@@ -188,13 +188,10 @@ namespace latinime {
const int lastSavedInputSize, const bool isGeometric,
const std::vector<int> *const sampledInputXs,
const std::vector<int> *const sampledInputYs,
- std::vector<NearKeycodesSet> *sampledNearKeySets,
std::vector<float> *sampledNormalizedSquaredLengthCache) {
- sampledNearKeySets->resize(sampledInputSize);
const int keyCount = proximityInfo->getKeyCount();
sampledNormalizedSquaredLengthCache->resize(sampledInputSize * keyCount);
for (int i = lastSavedInputSize; i < sampledInputSize; ++i) {
- (*sampledNearKeySets)[i].reset();
for (int k = 0; k < keyCount; ++k) {
const int index = i * keyCount + k;
const int x = (*sampledInputXs)[i];
@@ -203,10 +200,6 @@ namespace latinime {
proximityInfo->getNormalizedSquaredDistanceFromCenterFloatG(
k, x, y, isGeometric);
(*sampledNormalizedSquaredLengthCache)[index] = normalizedSquaredDistance;
- if (normalizedSquaredDistance
- < ProximityInfoParams::NEAR_KEY_NORMALIZED_SQUARED_THRESHOLD) {
- (*sampledNearKeySets)[i][k] = true;
- }
}
}
}
@@ -626,7 +619,6 @@ namespace latinime {
const std::vector<float> *const sampledSpeedRates,
const std::vector<int> *const sampledLengthCache,
const std::vector<float> *const sampledNormalizedSquaredLengthCache,
- std::vector<NearKeycodesSet> *sampledNearKeySets,
const ProximityInfo *const proximityInfo,
std::vector<hash_map_compat<int, float> > *charProbabilities) {
charProbabilities->resize(sampledInputSize);
@@ -643,12 +635,10 @@ namespace latinime {
float nearestKeyDistance = static_cast<float>(MAX_VALUE_FOR_WEIGHTING);
for (int j = 0; j < keyCount; ++j) {
- if ((*sampledNearKeySets)[i].test(j)) {
- const float distance = getPointToKeyByIdLength(
- maxPointToKeyLength, sampledNormalizedSquaredLengthCache, keyCount, i, j);
- if (distance < nearestKeyDistance) {
- nearestKeyDistance = distance;
- }
+ const float distance = getPointToKeyByIdLength(
+ maxPointToKeyLength, sampledNormalizedSquaredLengthCache, keyCount, i, j);
+ if (distance < nearestKeyDistance) {
+ nearestKeyDistance = distance;
}
}
@@ -744,27 +734,23 @@ namespace latinime {
// Summing up probability densities of all near keys.
float sumOfProbabilityDensities = 0.0f;
for (int j = 0; j < keyCount; ++j) {
- if ((*sampledNearKeySets)[i].test(j)) {
- sumOfProbabilityDensities += distribution.getProbabilityDensity(
- proximityInfo->getKeyCenterXOfKeyIdG(j,
- NOT_A_COORDINATE /* referencePointX */, true /* isGeometric */),
- proximityInfo->getKeyCenterYOfKeyIdG(j,
- NOT_A_COORDINATE /* referencePointY */, true /* isGeometric */));
- }
+ sumOfProbabilityDensities += distribution.getProbabilityDensity(
+ proximityInfo->getKeyCenterXOfKeyIdG(j,
+ NOT_A_COORDINATE /* referencePointX */, true /* isGeometric */),
+ proximityInfo->getKeyCenterYOfKeyIdG(j,
+ NOT_A_COORDINATE /* referencePointY */, true /* isGeometric */));
}
// Split the probability of an input point to keys that are close to the input point.
for (int j = 0; j < keyCount; ++j) {
- if ((*sampledNearKeySets)[i].test(j)) {
- const float probabilityDensity = distribution.getProbabilityDensity(
- proximityInfo->getKeyCenterXOfKeyIdG(j,
- NOT_A_COORDINATE /* referencePointX */, true /* isGeometric */),
- proximityInfo->getKeyCenterYOfKeyIdG(j,
- NOT_A_COORDINATE /* referencePointY */, true /* isGeometric */));
- const float probability = inputCharProbability * probabilityDensity
- / sumOfProbabilityDensities;
- (*charProbabilities)[i][j] = probability;
- }
+ const float probabilityDensity = distribution.getProbabilityDensity(
+ proximityInfo->getKeyCenterXOfKeyIdG(j,
+ NOT_A_COORDINATE /* referencePointX */, true /* isGeometric */),
+ proximityInfo->getKeyCenterYOfKeyIdG(j,
+ NOT_A_COORDINATE /* referencePointY */, true /* isGeometric */));
+ const float probability = inputCharProbability * probabilityDensity
+ / sumOfProbabilityDensities;
+ (*charProbabilities)[i][j] = probability;
}
}
@@ -820,10 +806,9 @@ namespace latinime {
for (int j = 0; j < keyCount; ++j) {
hash_map_compat<int, float>::iterator it = (*charProbabilities)[i].find(j);
if (it == (*charProbabilities)[i].end()){
- (*sampledNearKeySets)[i].reset(j);
+ continue;
} else if(it->second < ProximityInfoParams::MIN_PROBABILITY) {
// Erases from near keys vector because it has very low probability.
- (*sampledNearKeySets)[i].reset(j);
(*charProbabilities)[i].erase(j);
} else {
it->second = -logf(it->second);
@@ -835,9 +820,8 @@ namespace latinime {
/* static */ void ProximityInfoStateUtils::updateSampledSearchKeySets(
const ProximityInfo *const proximityInfo, const int sampledInputSize,
- const int lastSavedInputSize,
- const std::vector<int> *const sampledLengthCache,
- const std::vector<NearKeycodesSet> *const sampledNearKeySets,
+ const int lastSavedInputSize, const std::vector<int> *const sampledLengthCache,
+ const std::vector<hash_map_compat<int, float> > *const charProbabilities,
std::vector<NearKeycodesSet> *sampledSearchKeySets,
std::vector<std::vector<int> > *sampledSearchKeyVectors) {
sampledSearchKeySets->resize(sampledInputSize);
@@ -854,7 +838,12 @@ namespace latinime {
if ((*sampledLengthCache)[j] - (*sampledLengthCache)[i] >= readForwordLength) {
break;
}
- (*sampledSearchKeySets)[i] |= (*sampledNearKeySets)[j];
+ for(const auto& charProbability : charProbabilities->at(j)) {
+ if (charProbability.first == NOT_AN_INDEX) {
+ continue;
+ }
+ (*sampledSearchKeySets)[i].set(charProbability.first);
+ }
}
}
const int keyCount = proximityInfo->getKeyCount();
diff --git a/native/jni/src/suggest/core/layout/proximity_info_state_utils.h b/native/jni/src/suggest/core/layout/proximity_info_state_utils.h
index 5d7a9c589..7aa20c3d1 100644
--- a/native/jni/src/suggest/core/layout/proximity_info_state_utils.h
+++ b/native/jni/src/suggest/core/layout/proximity_info_state_utils.h
@@ -71,13 +71,12 @@ class ProximityInfoStateUtils {
const std::vector<float> *const sampledSpeedRates,
const std::vector<int> *const sampledLengthCache,
const std::vector<float> *const sampledNormalizedSquaredLengthCache,
- std::vector<NearKeycodesSet> *sampledNearKeySets,
const ProximityInfo *const proximityInfo,
std::vector<hash_map_compat<int, float> > *charProbabilities);
static void updateSampledSearchKeySets(const ProximityInfo *const proximityInfo,
const int sampledInputSize, const int lastSavedInputSize,
const std::vector<int> *const sampledLengthCache,
- const std::vector<NearKeycodesSet> *const sampledNearKeySets,
+ const std::vector<hash_map_compat<int, float> > *const charProbabilities,
std::vector<NearKeycodesSet> *sampledSearchKeySets,
std::vector<std::vector<int> > *sampledSearchKeyVectors);
static float getPointToKeyByIdLength(const float maxPointToKeyLength,
@@ -87,7 +86,6 @@ class ProximityInfoStateUtils {
const int sampledInputSize, const int lastSavedInputSize, const bool isGeometric,
const std::vector<int> *const sampledInputXs,
const std::vector<int> *const sampledInputYs,
- std::vector<NearKeycodesSet> *sampledNearKeySets,
std::vector<float> *sampledNormalizedSquaredLengthCache);
static void initPrimaryInputWord(const int inputSize, const int *const inputProximities,
int *primaryInputWord);