suggestion_results.cpp revision d2f7cd28aefb71f3f340f1a8572e5477e5f5dfb3
1/* 2 * Copyright (C) 2014 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#include "suggest/core/result/suggestion_results.h" 18 19#include "utils/jni_data_utils.h" 20 21namespace latinime { 22 23void SuggestionResults::outputSuggestions(JNIEnv *env, jintArray outSuggestionCount, 24 jintArray outputCodePointsArray, jintArray outScoresArray, jintArray outSpaceIndicesArray, 25 jintArray outTypesArray, jintArray outAutoCommitFirstWordConfidenceArray, 26 jfloatArray outLanguageWeight) { 27 int outputIndex = 0; 28 while (!mSuggestedWords.empty()) { 29 const SuggestedWord &suggestedWord = mSuggestedWords.top(); 30 suggestedWord.getCodePointCount(); 31 const int start = outputIndex * MAX_WORD_LENGTH; 32 JniDataUtils::outputCodePoints(env, outputCodePointsArray, start, 33 MAX_WORD_LENGTH /* maxLength */, suggestedWord.getCodePoint(), 34 suggestedWord.getCodePointCount(), true /* needsNullTermination */); 35 const int score = suggestedWord.getScore(); 36 env->SetIntArrayRegion(outScoresArray, outputIndex, 1 /* len */, &score); 37 const int indexToPartialCommit = suggestedWord.getIndexToPartialCommit(); 38 env->SetIntArrayRegion(outSpaceIndicesArray, outputIndex, 1 /* len */, 39 &indexToPartialCommit); 40 const int type = suggestedWord.getType(); 41 env->SetIntArrayRegion(outTypesArray, outputIndex, 1 /* len */, &type); 42 if (mSuggestedWords.size() == 1) { 43 const int autoCommitFirstWordConfidence = 44 suggestedWord.getAutoCommitFirstWordConfidence(); 45 env->SetIntArrayRegion(outAutoCommitFirstWordConfidenceArray, 0 /* start */, 46 1 /* len */, &autoCommitFirstWordConfidence); 47 } 48 ++outputIndex; 49 mSuggestedWords.pop(); 50 } 51 env->SetIntArrayRegion(outSuggestionCount, 0 /* start */, 1 /* len */, &outputIndex); 52 env->SetFloatArrayRegion(outLanguageWeight, 0 /* start */, 1 /* len */, &mLanguageWeight); 53} 54 55void SuggestionResults::addPrediction(const int *const codePoints, const int codePointCount, 56 const int probability) { 57 if (probability == NOT_A_PROBABILITY) { 58 // Invalid word. 59 return; 60 } 61 addSuggestion(codePoints, codePointCount, probability, Dictionary::KIND_PREDICTION, 62 NOT_AN_INDEX, NOT_A_FIRST_WORD_CONFIDENCE); 63} 64 65void SuggestionResults::addSuggestion(const int *const codePoints, const int codePointCount, 66 const int score, const int type, const int indexToPartialCommit, 67 const int autocimmitFirstWordConfindence) { 68 if (codePointCount <= 0 || codePointCount > MAX_WORD_LENGTH) { 69 // Invalid word. 70 AKLOGE("Invalid word is added to the suggestion results. codePointCount: %d", 71 codePointCount); 72 return; 73 } 74 if (getSuggestionCount() >= mMaxSuggestionCount) { 75 const SuggestedWord &mWorstSuggestion = mSuggestedWords.top(); 76 if (score > mWorstSuggestion.getScore() || (score == mWorstSuggestion.getScore() 77 && codePointCount < mWorstSuggestion.getCodePointCount())) { 78 mSuggestedWords.pop(); 79 } else { 80 return; 81 } 82 } 83 mSuggestedWords.push(SuggestedWord(codePoints, codePointCount, score, type, 84 indexToPartialCommit, autocimmitFirstWordConfindence)); 85} 86 87void SuggestionResults::getSortedScores(int *const outScores) const { 88 auto copyOfSuggestedWords = mSuggestedWords; 89 while (!copyOfSuggestedWords.empty()) { 90 const SuggestedWord &suggestedWord = copyOfSuggestedWords.top(); 91 outScores[copyOfSuggestedWords.size() - 1] = suggestedWord.getScore(); 92 copyOfSuggestedWords.pop(); 93 } 94} 95 96void SuggestionResults::dumpSuggestions() const { 97 AKLOGE("language weight: %f", mLanguageWeight); 98 std::vector<SuggestedWord> suggestedWords; 99 auto copyOfSuggestedWords = mSuggestedWords; 100 while (!copyOfSuggestedWords.empty()) { 101 suggestedWords.push_back(copyOfSuggestedWords.top()); 102 copyOfSuggestedWords.pop(); 103 } 104 int index = 0; 105 for (auto it = suggestedWords.rbegin(); it != suggestedWords.rend(); ++it) { 106 DUMP_SUGGESTION(it->getCodePoint(), it->getCodePointCount(), index, it->getScore()); 107 index++; 108 } 109} 110 111} // namespace latinime 112