Merge "Add a flag to demote completed suggestions"
commit
db096d681f
|
@ -61,6 +61,8 @@ public class BinaryDictionary extends Dictionary {
|
||||||
public static final Flag FLAG_REQUIRES_GERMAN_UMLAUT_PROCESSING =
|
public static final Flag FLAG_REQUIRES_GERMAN_UMLAUT_PROCESSING =
|
||||||
new Flag(R.bool.config_require_umlaut_processing, 0x1);
|
new Flag(R.bool.config_require_umlaut_processing, 0x1);
|
||||||
|
|
||||||
|
public static final Flag FLAG_USE_FULL_EDIT_DISTANCE = new Flag(0x2);
|
||||||
|
|
||||||
// Can create a new flag from extravalue :
|
// Can create a new flag from extravalue :
|
||||||
// public static final Flag FLAG_MYFLAG =
|
// public static final Flag FLAG_MYFLAG =
|
||||||
// new Flag("my_flag", 0x02);
|
// new Flag("my_flag", 0x02);
|
||||||
|
|
|
@ -25,8 +25,9 @@ public class Flag {
|
||||||
public final int mMask;
|
public final int mMask;
|
||||||
public final int mSource;
|
public final int mSource;
|
||||||
|
|
||||||
static private final int SOURCE_CONFIG = 1;
|
private static final int SOURCE_CONFIG = 1;
|
||||||
static private final int SOURCE_EXTRAVALUE = 2;
|
private static final int SOURCE_EXTRAVALUE = 2;
|
||||||
|
private static final int SOURCE_PARAM = 3;
|
||||||
|
|
||||||
public Flag(int resourceId, int mask) {
|
public Flag(int resourceId, int mask) {
|
||||||
mName = null;
|
mName = null;
|
||||||
|
@ -42,6 +43,13 @@ public class Flag {
|
||||||
mMask = mask;
|
mMask = mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Flag(int mask) {
|
||||||
|
mName = null;
|
||||||
|
mResource = 0;
|
||||||
|
mSource = SOURCE_PARAM;
|
||||||
|
mMask = mask;
|
||||||
|
}
|
||||||
|
|
||||||
// If context/switcher are null, set all related flags in flagArray to on.
|
// If context/switcher are null, set all related flags in flagArray to on.
|
||||||
public static int initFlags(Flag[] flagArray, Context context, SubtypeSwitcher switcher) {
|
public static int initFlags(Flag[] flagArray, Context context, SubtypeSwitcher switcher) {
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
|
@ -57,6 +65,9 @@ public class Flag {
|
||||||
switcher.currentSubtypeContainsExtraValueKey(entry.mName))
|
switcher.currentSubtypeContainsExtraValueKey(entry.mName))
|
||||||
flags |= entry.mMask;
|
flags |= entry.mMask;
|
||||||
break;
|
break;
|
||||||
|
case Flag.SOURCE_PARAM:
|
||||||
|
flags |= entry.mMask;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return flags;
|
return flags;
|
||||||
|
|
|
@ -62,7 +62,8 @@ void Correction::initCorrectionState(
|
||||||
}
|
}
|
||||||
|
|
||||||
void Correction::setCorrectionParams(const int skipPos, const int excessivePos,
|
void Correction::setCorrectionParams(const int skipPos, const int excessivePos,
|
||||||
const int transposedPos, const int spaceProximityPos, const int missingSpacePos) {
|
const int transposedPos, const int spaceProximityPos, const int missingSpacePos,
|
||||||
|
const bool useFullEditDistance) {
|
||||||
// TODO: remove
|
// TODO: remove
|
||||||
mTransposedPos = transposedPos;
|
mTransposedPos = transposedPos;
|
||||||
mExcessivePos = excessivePos;
|
mExcessivePos = excessivePos;
|
||||||
|
@ -74,6 +75,7 @@ void Correction::setCorrectionParams(const int skipPos, const int excessivePos,
|
||||||
|
|
||||||
mSpaceProximityPos = spaceProximityPos;
|
mSpaceProximityPos = spaceProximityPos;
|
||||||
mMissingSpacePos = missingSpacePos;
|
mMissingSpacePos = missingSpacePos;
|
||||||
|
mUseFullEditDistance = useFullEditDistance;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Correction::checkState() {
|
void Correction::checkState() {
|
||||||
|
@ -439,7 +441,7 @@ inline static void multiplyIntCapped(const int multiplier, int *base) {
|
||||||
}
|
}
|
||||||
|
|
||||||
inline static int powerIntCapped(const int base, const int n) {
|
inline static int powerIntCapped(const int base, const int n) {
|
||||||
if (n == 0) return 1;
|
if (n <= 0) return 1;
|
||||||
if (base == 2) {
|
if (base == 2) {
|
||||||
return n < 31 ? 1 << n : S_INT_MAX;
|
return n < 31 ? 1 << n : S_INT_MAX;
|
||||||
} else {
|
} else {
|
||||||
|
@ -529,6 +531,8 @@ int Correction::RankingAlgorithm::calculateFinalFreq(const int inputIndex, const
|
||||||
const int excessiveCount = correction->mExcessiveCount + correction->mTransposedCount % 2;
|
const int excessiveCount = correction->mExcessiveCount + correction->mTransposedCount % 2;
|
||||||
const int proximityMatchedCount = correction->mProximityCount;
|
const int proximityMatchedCount = correction->mProximityCount;
|
||||||
const bool lastCharExceeded = correction->mLastCharExceeded;
|
const bool lastCharExceeded = correction->mLastCharExceeded;
|
||||||
|
const bool useFullEditDistance = correction->mUseFullEditDistance;
|
||||||
|
const int outputLength = outputIndex + 1;
|
||||||
if (skippedCount >= inputLength || inputLength == 0) {
|
if (skippedCount >= inputLength || inputLength == 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -682,6 +686,12 @@ int Correction::RankingAlgorithm::calculateFinalFreq(const int inputIndex, const
|
||||||
multiplyIntCapped(fullWordMultiplier, &finalFreq);
|
multiplyIntCapped(fullWordMultiplier, &finalFreq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (useFullEditDistance && outputLength > inputLength + 1) {
|
||||||
|
const int diff = outputLength - inputLength - 1;
|
||||||
|
const int divider = diff < 31 ? 1 << diff : S_INT_MAX;
|
||||||
|
finalFreq = divider > finalFreq ? 1 : finalFreq / divider;
|
||||||
|
}
|
||||||
|
|
||||||
if (DEBUG_DICT_FULL) {
|
if (DEBUG_DICT_FULL) {
|
||||||
LOGI("calc: %d, %d", outputIndex, sameLength);
|
LOGI("calc: %d, %d", outputIndex, sameLength);
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ public:
|
||||||
|
|
||||||
// TODO: remove
|
// TODO: remove
|
||||||
void setCorrectionParams(const int skipPos, const int excessivePos, const int transposedPos,
|
void setCorrectionParams(const int skipPos, const int excessivePos, const int transposedPos,
|
||||||
const int spaceProximityPos, const int missingSpacePos);
|
const int spaceProximityPos, const int missingSpacePos, const bool useFullEditDistance);
|
||||||
void checkState();
|
void checkState();
|
||||||
bool initProcessState(const int index);
|
bool initProcessState(const int index);
|
||||||
|
|
||||||
|
@ -111,6 +111,7 @@ private:
|
||||||
const int FULL_WORD_MULTIPLIER;
|
const int FULL_WORD_MULTIPLIER;
|
||||||
const ProximityInfo *mProximityInfo;
|
const ProximityInfo *mProximityInfo;
|
||||||
|
|
||||||
|
bool mUseFullEditDistance;
|
||||||
int mMaxEditDistance;
|
int mMaxEditDistance;
|
||||||
int mMaxDepth;
|
int mMaxDepth;
|
||||||
int mInputLength;
|
int mInputLength;
|
||||||
|
|
|
@ -132,7 +132,8 @@ void UnigramDictionary::getWordWithDigraphSuggestionsRec(ProximityInfo *proximit
|
||||||
memcpy(codesDest, codesSrc, remainingBytes);
|
memcpy(codesDest, codesSrc, remainingBytes);
|
||||||
|
|
||||||
getWordSuggestions(proximityInfo, xcoordinates, ycoordinates, codesBuffer,
|
getWordSuggestions(proximityInfo, xcoordinates, ycoordinates, codesBuffer,
|
||||||
(codesDest - codesBuffer) / MAX_PROXIMITY_CHARS + codesRemain, outWords, frequencies);
|
(codesDest - codesBuffer) / MAX_PROXIMITY_CHARS + codesRemain, outWords, frequencies,
|
||||||
|
flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
int UnigramDictionary::getSuggestions(ProximityInfo *proximityInfo, const int *xcoordinates,
|
int UnigramDictionary::getSuggestions(ProximityInfo *proximityInfo, const int *xcoordinates,
|
||||||
|
@ -146,7 +147,7 @@ int UnigramDictionary::getSuggestions(ProximityInfo *proximityInfo, const int *x
|
||||||
codesSize, flags, codes, codesSize, 0, codesBuffer, outWords, frequencies);
|
codesSize, flags, codes, codesSize, 0, codesBuffer, outWords, frequencies);
|
||||||
} else { // Normal processing
|
} else { // Normal processing
|
||||||
getWordSuggestions(proximityInfo, xcoordinates, ycoordinates, codes, codesSize,
|
getWordSuggestions(proximityInfo, xcoordinates, ycoordinates, codes, codesSize,
|
||||||
outWords, frequencies);
|
outWords, frequencies, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
PROF_START(20);
|
PROF_START(20);
|
||||||
|
@ -175,7 +176,7 @@ int UnigramDictionary::getSuggestions(ProximityInfo *proximityInfo, const int *x
|
||||||
|
|
||||||
void UnigramDictionary::getWordSuggestions(ProximityInfo *proximityInfo,
|
void UnigramDictionary::getWordSuggestions(ProximityInfo *proximityInfo,
|
||||||
const int *xcoordinates, const int *ycoordinates, const int *codes, const int codesSize,
|
const int *xcoordinates, const int *ycoordinates, const int *codes, const int codesSize,
|
||||||
unsigned short *outWords, int *frequencies) {
|
unsigned short *outWords, int *frequencies, const int flags) {
|
||||||
|
|
||||||
PROF_OPEN;
|
PROF_OPEN;
|
||||||
PROF_START(0);
|
PROF_START(0);
|
||||||
|
@ -187,9 +188,10 @@ void UnigramDictionary::getWordSuggestions(ProximityInfo *proximityInfo,
|
||||||
mCorrection->initCorrection(mProximityInfo, mInputLength, maxDepth);
|
mCorrection->initCorrection(mProximityInfo, mInputLength, maxDepth);
|
||||||
PROF_END(0);
|
PROF_END(0);
|
||||||
|
|
||||||
|
const bool useFullEditDistance = USE_FULL_EDIT_DISTANCE & flags;
|
||||||
// TODO: remove
|
// TODO: remove
|
||||||
PROF_START(1);
|
PROF_START(1);
|
||||||
getSuggestionCandidates();
|
getSuggestionCandidates(useFullEditDistance);
|
||||||
PROF_END(1);
|
PROF_END(1);
|
||||||
|
|
||||||
PROF_START(2);
|
PROF_START(2);
|
||||||
|
@ -212,7 +214,7 @@ void UnigramDictionary::getWordSuggestions(ProximityInfo *proximityInfo,
|
||||||
if (DEBUG_DICT) {
|
if (DEBUG_DICT) {
|
||||||
LOGI("--- Suggest missing space characters %d", i);
|
LOGI("--- Suggest missing space characters %d", i);
|
||||||
}
|
}
|
||||||
getMissingSpaceWords(mInputLength, i, mCorrection);
|
getMissingSpaceWords(mInputLength, i, mCorrection, useFullEditDistance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PROF_END(5);
|
PROF_END(5);
|
||||||
|
@ -231,7 +233,7 @@ void UnigramDictionary::getWordSuggestions(ProximityInfo *proximityInfo,
|
||||||
i, x, y, proximityInfo->hasSpaceProximity(x, y));
|
i, x, y, proximityInfo->hasSpaceProximity(x, y));
|
||||||
}
|
}
|
||||||
if (proximityInfo->hasSpaceProximity(x, y)) {
|
if (proximityInfo->hasSpaceProximity(x, y)) {
|
||||||
getMistypedSpaceWords(mInputLength, i, mCorrection);
|
getMistypedSpaceWords(mInputLength, i, mCorrection, useFullEditDistance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -315,10 +317,10 @@ bool UnigramDictionary::addWord(unsigned short *word, int length, int frequency)
|
||||||
static const char QUOTE = '\'';
|
static const char QUOTE = '\'';
|
||||||
static const char SPACE = ' ';
|
static const char SPACE = ' ';
|
||||||
|
|
||||||
void UnigramDictionary::getSuggestionCandidates() {
|
void UnigramDictionary::getSuggestionCandidates(const bool useFullEditDistance) {
|
||||||
// TODO: Remove setCorrectionParams
|
// TODO: Remove setCorrectionParams
|
||||||
mCorrection->setCorrectionParams(0, 0, 0,
|
mCorrection->setCorrectionParams(0, 0, 0,
|
||||||
-1 /* spaceProximityPos */, -1 /* missingSpacePos */);
|
-1 /* spaceProximityPos */, -1 /* missingSpacePos */, useFullEditDistance);
|
||||||
int rootPosition = ROOT_POS;
|
int rootPosition = ROOT_POS;
|
||||||
// Get the number of children of root, then increment the position
|
// Get the number of children of root, then increment the position
|
||||||
int childCount = Dictionary::getCount(DICT_ROOT, &rootPosition);
|
int childCount = Dictionary::getCount(DICT_ROOT, &rootPosition);
|
||||||
|
@ -349,16 +351,20 @@ void UnigramDictionary::getSuggestionCandidates() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void UnigramDictionary::getMissingSpaceWords(
|
void UnigramDictionary::getMissingSpaceWords(
|
||||||
const int inputLength, const int missingSpacePos, Correction *correction) {
|
const int inputLength, const int missingSpacePos, Correction *correction,
|
||||||
|
const bool useFullEditDistance) {
|
||||||
correction->setCorrectionParams(-1 /* skipPos */, -1 /* excessivePos */,
|
correction->setCorrectionParams(-1 /* skipPos */, -1 /* excessivePos */,
|
||||||
-1 /* transposedPos */, -1 /* spaceProximityPos */, missingSpacePos);
|
-1 /* transposedPos */, -1 /* spaceProximityPos */, missingSpacePos,
|
||||||
|
useFullEditDistance);
|
||||||
getSplitTwoWordsSuggestion(inputLength, correction);
|
getSplitTwoWordsSuggestion(inputLength, correction);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UnigramDictionary::getMistypedSpaceWords(
|
void UnigramDictionary::getMistypedSpaceWords(
|
||||||
const int inputLength, const int spaceProximityPos, Correction *correction) {
|
const int inputLength, const int spaceProximityPos, Correction *correction,
|
||||||
|
const bool useFullEditDistance) {
|
||||||
correction->setCorrectionParams(-1 /* skipPos */, -1 /* excessivePos */,
|
correction->setCorrectionParams(-1 /* skipPos */, -1 /* excessivePos */,
|
||||||
-1 /* transposedPos */, spaceProximityPos, -1 /* missingSpacePos */);
|
-1 /* transposedPos */, spaceProximityPos, -1 /* missingSpacePos */,
|
||||||
|
useFullEditDistance);
|
||||||
getSplitTwoWordsSuggestion(inputLength, correction);
|
getSplitTwoWordsSuggestion(inputLength, correction);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,7 @@ private:
|
||||||
|
|
||||||
void getWordSuggestions(ProximityInfo *proximityInfo, const int *xcoordinates,
|
void getWordSuggestions(ProximityInfo *proximityInfo, const int *xcoordinates,
|
||||||
const int *ycoordinates, const int *codes, const int codesSize,
|
const int *ycoordinates, const int *codes, const int codesSize,
|
||||||
unsigned short *outWords, int *frequencies);
|
unsigned short *outWords, int *frequencies, const int flags);
|
||||||
bool isDigraph(const int* codes, const int i, const int codesSize) const;
|
bool isDigraph(const int* codes, const int i, const int codesSize) const;
|
||||||
void getWordWithDigraphSuggestionsRec(ProximityInfo *proximityInfo,
|
void getWordWithDigraphSuggestionsRec(ProximityInfo *proximityInfo,
|
||||||
const int *xcoordinates, const int* ycoordinates, const int *codesBuffer,
|
const int *xcoordinates, const int* ycoordinates, const int *codesBuffer,
|
||||||
|
@ -87,13 +87,13 @@ private:
|
||||||
void initSuggestions(ProximityInfo *proximityInfo, const int *xcoordinates,
|
void initSuggestions(ProximityInfo *proximityInfo, const int *xcoordinates,
|
||||||
const int *ycoordinates, const int *codes, const int codesSize,
|
const int *ycoordinates, const int *codes, const int codesSize,
|
||||||
unsigned short *outWords, int *frequencies);
|
unsigned short *outWords, int *frequencies);
|
||||||
void getSuggestionCandidates();
|
void getSuggestionCandidates(const bool useFullEditDistance);
|
||||||
bool addWord(unsigned short *word, int length, int frequency);
|
bool addWord(unsigned short *word, int length, int frequency);
|
||||||
void getSplitTwoWordsSuggestion(const int inputLength, Correction *correction);
|
void getSplitTwoWordsSuggestion(const int inputLength, Correction *correction);
|
||||||
void getMissingSpaceWords(
|
void getMissingSpaceWords(const int inputLength, const int missingSpacePos,
|
||||||
const int inputLength, const int missingSpacePos, Correction *correction);
|
Correction *correction, const bool useFullEditDistance);
|
||||||
void getMistypedSpaceWords(
|
void getMistypedSpaceWords(const int inputLength, const int spaceProximityPos,
|
||||||
const int inputLength, const int spaceProximityPos, Correction *correction);
|
Correction *correction, const bool useFullEditDistance);
|
||||||
void onTerminal(const int freq, Correction *correction);
|
void onTerminal(const int freq, Correction *correction);
|
||||||
bool needsToSkipCurrentNode(const unsigned short c,
|
bool needsToSkipCurrentNode(const unsigned short c,
|
||||||
const int inputIndex, const int skipPos, const int depth);
|
const int inputIndex, const int skipPos, const int depth);
|
||||||
|
@ -122,7 +122,8 @@ private:
|
||||||
// or something very bad (like, the apocalypse) will happen.
|
// or something very bad (like, the apocalypse) will happen.
|
||||||
// Please update both at the same time.
|
// Please update both at the same time.
|
||||||
enum {
|
enum {
|
||||||
REQUIRES_GERMAN_UMLAUT_PROCESSING = 0x1
|
REQUIRES_GERMAN_UMLAUT_PROCESSING = 0x1,
|
||||||
|
USE_FULL_EDIT_DISTANCE = 0x2
|
||||||
};
|
};
|
||||||
static const struct digraph_t { int first; int second; } GERMAN_UMLAUT_DIGRAPHS[];
|
static const struct digraph_t { int first; int second; } GERMAN_UMLAUT_DIGRAPHS[];
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue