From 744dab691e45ff8c5ca9745ee673f50060bcb7a9 Mon Sep 17 00:00:00 2001 From: satok Date: Thu, 15 Dec 2011 22:29:05 +0900 Subject: [PATCH] Prepare for proximity + two words suggestion Change-Id: I3637f9bec1f4a3c5953498c4562e1f17a7bf593c --- native/src/proximity_info.cpp | 10 ++++- native/src/unigram_dictionary.cpp | 64 ++++++++++++++++++------------- native/src/unigram_dictionary.h | 23 +++++++---- native/src/words_priority_queue.h | 4 ++ 4 files changed, 66 insertions(+), 35 deletions(-) diff --git a/native/src/proximity_info.cpp b/native/src/proximity_info.cpp index 6857caf00..6e26da276 100644 --- a/native/src/proximity_info.cpp +++ b/native/src/proximity_info.cpp @@ -100,9 +100,17 @@ inline int ProximityInfo::getStartIndexFromCoordinates(const int x, const int y) } bool ProximityInfo::hasSpaceProximity(const int x, const int y) const { + if (x < 0 || y < 0) { + if (DEBUG_DICT) { + LOGI("HasSpaceProximity: Illegal coordinates (%d, %d)", x, y); + assert(true); + } + return false; + } + const int startIndex = getStartIndexFromCoordinates(x, y); if (DEBUG_PROXIMITY_INFO) { - LOGI("hasSpaceProximity: index %d", startIndex); + LOGI("hasSpaceProximity: index %d, %d, %d", startIndex, x, y); } for (int i = 0; i < MAX_PROXIMITY_CHARS_SIZE; ++i) { if (DEBUG_PROXIMITY_INFO) { diff --git a/native/src/unigram_dictionary.cpp b/native/src/unigram_dictionary.cpp index 0db33e7d8..15fe9715b 100644 --- a/native/src/unigram_dictionary.cpp +++ b/native/src/unigram_dictionary.cpp @@ -182,21 +182,16 @@ void UnigramDictionary::getWordSuggestions(ProximityInfo *proximityInfo, const int *xcoordinates, const int *ycoordinates, const int *codes, const int inputLength, const int flags, Correction *correction, WordsPriorityQueuePool *queuePool) { - WordsPriorityQueue *masterQueue = queuePool->getMasterQueue(); PROF_OPEN; PROF_START(0); - initSuggestions(proximityInfo, xcoordinates, ycoordinates, codes, inputLength, masterQueue); - if (DEBUG_DICT) assert(codesSize == inputLength); - - const int maxDepth = min(inputLength * MAX_DEPTH_MULTIPLIER, MAX_WORD_LENGTH); - correction->initCorrection(proximityInfo, inputLength, maxDepth); + // Note: This line is intentionally left blank PROF_END(0); - const bool useFullEditDistance = USE_FULL_EDIT_DISTANCE & flags; - // TODO: remove PROF_START(1); - getSuggestionCandidates(useFullEditDistance, inputLength, correction, masterQueue); + const bool useFullEditDistance = USE_FULL_EDIT_DISTANCE & flags; + getOneWordSuggestions(proximityInfo, xcoordinates, ycoordinates, codes, useFullEditDistance, + inputLength, correction, queuePool); PROF_END(1); PROF_START(2); @@ -219,8 +214,8 @@ void UnigramDictionary::getWordSuggestions(ProximityInfo *proximityInfo, if (DEBUG_DICT) { LOGI("--- Suggest missing space characters %d", i); } - getMissingSpaceWords( - inputLength, i, proximityInfo, correction, useFullEditDistance, queuePool); + getMissingSpaceWords(proximityInfo, xcoordinates, ycoordinates, codes, + useFullEditDistance, inputLength, i, correction, queuePool); } } PROF_END(5); @@ -239,8 +234,8 @@ void UnigramDictionary::getWordSuggestions(ProximityInfo *proximityInfo, i, x, y, proximityInfo->hasSpaceProximity(x, y)); } if (proximityInfo->hasSpaceProximity(x, y)) { - getMistypedSpaceWords(inputLength, i, proximityInfo, correction, - useFullEditDistance, queuePool); + getMistypedSpaceWords(proximityInfo, xcoordinates, ycoordinates, codes, + useFullEditDistance, inputLength, i, correction, queuePool); } } } @@ -260,6 +255,18 @@ void UnigramDictionary::initSuggestions(ProximityInfo *proximityInfo, const int static const char QUOTE = '\''; static const char SPACE = ' '; +void UnigramDictionary::getOneWordSuggestions(ProximityInfo *proximityInfo, + const int *xcoordinates, const int *ycoordinates, const int *codes, + const bool useFullEditDistance, const int inputLength, Correction *correction, + WordsPriorityQueuePool *queuePool) { + WordsPriorityQueue *masterQueue = queuePool->getMasterQueue(); + initSuggestions(proximityInfo, xcoordinates, ycoordinates, codes, inputLength, masterQueue); + if (DEBUG_DICT) assert(codesSize == inputLength); + const int maxDepth = min(inputLength * MAX_DEPTH_MULTIPLIER, MAX_WORD_LENGTH); + correction->initCorrection(proximityInfo, inputLength, maxDepth); + getSuggestionCandidates(useFullEditDistance, inputLength, correction, masterQueue); +} + void UnigramDictionary::getSuggestionCandidates(const bool useFullEditDistance, const int inputLength, Correction *correction, WordsPriorityQueue *queue) { // TODO: Remove setCorrectionParams @@ -295,22 +302,28 @@ void UnigramDictionary::getSuggestionCandidates(const bool useFullEditDistance, } } -void UnigramDictionary::getMissingSpaceWords( - const int inputLength, const int missingSpacePos, ProximityInfo *proximityInfo, - Correction *correction, const bool useFullEditDistance, WordsPriorityQueuePool *queuePool) { +void UnigramDictionary::getMissingSpaceWords(ProximityInfo *proximityInfo, const int *xcoordinates, + const int *ycoordinates, const int *codes, const bool useFullEditDistance, + const int inputLength, const int missingSpacePos, Correction *correction, + WordsPriorityQueuePool* queuePool) { correction->setCorrectionParams(-1 /* skipPos */, -1 /* excessivePos */, -1 /* transposedPos */, -1 /* spaceProximityPos */, missingSpacePos, useFullEditDistance, false /* doAutoCompletion */, MAX_ERRORS_FOR_TWO_WORDS); - getSplitTwoWordsSuggestion(inputLength, proximityInfo, correction, queuePool); + getSplitTwoWordsSuggestions(proximityInfo, xcoordinates, ycoordinates, codes, + useFullEditDistance, inputLength, missingSpacePos, -1/* spaceProximityPos */, + correction, queuePool); } -void UnigramDictionary::getMistypedSpaceWords( - const int inputLength, const int spaceProximityPos, ProximityInfo *proximityInfo, - Correction *correction, const bool useFullEditDistance, WordsPriorityQueuePool *queuePool) { +void UnigramDictionary::getMistypedSpaceWords(ProximityInfo *proximityInfo, const int *xcoordinates, + const int *ycoordinates, const int *codes, const bool useFullEditDistance, + const int inputLength, const int spaceProximityPos, Correction *correction, + WordsPriorityQueuePool* queuePool) { correction->setCorrectionParams(-1 /* skipPos */, -1 /* excessivePos */, -1 /* transposedPos */, spaceProximityPos, -1 /* missingSpacePos */, useFullEditDistance, false /* doAutoCompletion */, MAX_ERRORS_FOR_TWO_WORDS); - getSplitTwoWordsSuggestion(inputLength, proximityInfo, correction, queuePool); + getSplitTwoWordsSuggestions(proximityInfo, xcoordinates, ycoordinates, codes, + useFullEditDistance, inputLength, -1 /* missingSpacePos */, spaceProximityPos, + correction, queuePool); } inline void UnigramDictionary::onTerminal( @@ -323,13 +336,12 @@ inline void UnigramDictionary::onTerminal( } } -void UnigramDictionary::getSplitTwoWordsSuggestion( - const int inputLength, ProximityInfo *proximityInfo, Correction *correction, - WordsPriorityQueuePool *queuePool) { +void UnigramDictionary::getSplitTwoWordsSuggestions(ProximityInfo *proximityInfo, + const int *xcoordinates, const int *ycoordinates, const int *codes, + const bool useFullEditDistance, const int inputLength, const int missingSpacePos, + const int spaceProximityPos, Correction *correction, WordsPriorityQueuePool* queuePool) { WordsPriorityQueue *masterQueue = queuePool->getMasterQueue(); - const int spaceProximityPos = correction->getSpaceProximityPos(); - const int missingSpacePos = correction->getMissingSpacePos(); if (DEBUG_DICT) { int inputCount = 0; if (spaceProximityPos >= 0) ++inputCount; diff --git a/native/src/unigram_dictionary.h b/native/src/unigram_dictionary.h index ce15cdd8f..27ebef157 100644 --- a/native/src/unigram_dictionary.h +++ b/native/src/unigram_dictionary.h @@ -91,17 +91,24 @@ private: void initSuggestions(ProximityInfo *proximityInfo, const int *xcoordinates, const int *ycoordinates, const int *codes, const int codesSize, WordsPriorityQueue *queue); + void getOneWordSuggestions(ProximityInfo *proximityInfo, const int *xcoordinates, + const int *ycoordinates, const int *codes, const bool useFullEditDistance, + const int inputLength, Correction *correction, WordsPriorityQueuePool* queuePool); void getSuggestionCandidates( const bool useFullEditDistance, const int inputLength, Correction *correction, WordsPriorityQueue* queue); - void getSplitTwoWordsSuggestion(const int inputLength, ProximityInfo *proximityInfo, - Correction *correction, WordsPriorityQueuePool *queuePool); - void getMissingSpaceWords(const int inputLength, const int missingSpacePos, - ProximityInfo *proximityInfo, Correction *correction, - const bool useFullEditDistance, WordsPriorityQueuePool *queuePool); - void getMistypedSpaceWords(const int inputLength, const int spaceProximityPos, - ProximityInfo *proximityInfo, Correction *correction, - const bool useFullEditDistance, WordsPriorityQueuePool *queuePool); + void getSplitTwoWordsSuggestions(ProximityInfo *proximityInfo, + const int *xcoordinates, const int *ycoordinates, const int *codes, + const bool useFullEditDistance, const int inputLength, const int spaceProximityPos, + const int missingSpacePos, Correction *correction, WordsPriorityQueuePool* queuePool); + void getMissingSpaceWords(ProximityInfo *proximityInfo, const int *xcoordinates, + const int *ycoordinates, const int *codes, const bool useFullEditDistance, + const int inputLength, const int missingSpacePos, Correction *correction, + WordsPriorityQueuePool* queuePool); + void getMistypedSpaceWords(ProximityInfo *proximityInfo, const int *xcoordinates, + const int *ycoordinates, const int *codes, const bool useFullEditDistance, + const int inputLength, const int spaceProximityPos, Correction *correction, + WordsPriorityQueuePool* queuePool); void onTerminal(const int freq, Correction *correction, WordsPriorityQueue *queue); bool needsToSkipCurrentNode(const unsigned short c, const int inputIndex, const int skipPos, const int depth); diff --git a/native/src/words_priority_queue.h b/native/src/words_priority_queue.h index a4175d3e0..2d6270977 100644 --- a/native/src/words_priority_queue.h +++ b/native/src/words_priority_queue.h @@ -111,6 +111,10 @@ public: return size; } + int size() { + return mSuggestions.size(); + } + void clear() { while (!mSuggestions.empty()) { SuggestedWord* sw = mSuggestions.top();