Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Side by Side Diff: third_party/android_prediction/suggest/core/policy/weighting.cpp

Issue 1247903003: Add spellcheck and word suggestion to the prediction service (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: format README and CHROMIUM.diff Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * Copyright (C) 2013 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 "third_party/android_prediction/suggest/core/policy/weighting.h"
18
19 #include "third_party/android_prediction/defines.h"
20 #include "third_party/android_prediction/suggest/core/dicnode/dic_node.h"
21 #include "third_party/android_prediction/suggest/core/dicnode/dic_node_profiler. h"
22 #include "third_party/android_prediction/suggest/core/dicnode/dic_node_utils.h"
23 #include "third_party/android_prediction/suggest/core/dictionary/error_type_util s.h"
24 #include "third_party/android_prediction/suggest/core/session/dic_traverse_sessi on.h"
25
26 namespace latinime {
27
28 class MultiBigramMap;
29
30 static inline void profile(const CorrectionType correctionType, DicNode *const n ode) {
31 #if DEBUG_DICT
32 switch (correctionType) {
33 case CT_OMISSION:
34 PROF_OMISSION(node->mProfiler);
35 return;
36 case CT_ADDITIONAL_PROXIMITY:
37 PROF_ADDITIONAL_PROXIMITY(node->mProfiler);
38 return;
39 case CT_SUBSTITUTION:
40 PROF_SUBSTITUTION(node->mProfiler);
41 return;
42 case CT_NEW_WORD_SPACE_OMISSION:
43 PROF_NEW_WORD(node->mProfiler);
44 return;
45 case CT_MATCH:
46 PROF_MATCH(node->mProfiler);
47 return;
48 case CT_COMPLETION:
49 PROF_COMPLETION(node->mProfiler);
50 return;
51 case CT_TERMINAL:
52 PROF_TERMINAL(node->mProfiler);
53 return;
54 case CT_TERMINAL_INSERTION:
55 PROF_TERMINAL_INSERTION(node->mProfiler);
56 return;
57 case CT_NEW_WORD_SPACE_SUBSTITUTION:
58 PROF_SPACE_SUBSTITUTION(node->mProfiler);
59 return;
60 case CT_INSERTION:
61 PROF_INSERTION(node->mProfiler);
62 return;
63 case CT_TRANSPOSITION:
64 PROF_TRANSPOSITION(node->mProfiler);
65 return;
66 default:
67 // do nothing
68 return;
69 }
70 #else
71 // do nothing
72 #endif
73 }
74
75 /* static */ void Weighting::addCostAndForwardInputIndex(const Weighting *const weighting,
76 const CorrectionType correctionType, const DicTraverseSession *const tra verseSession,
77 const DicNode *const parentDicNode, DicNode *const dicNode,
78 MultiBigramMap *const multiBigramMap) {
79 const int inputSize = traverseSession->getInputSize();
80 DicNode_InputStateG inputStateG;
81 inputStateG.mNeedsToUpdateInputStateG = false; // Don't use input info by de fault
82 const float spatialCost = Weighting::getSpatialCost(weighting, correctionTyp e,
83 traverseSession, parentDicNode, dicNode, &inputStateG);
84 const float languageCost = Weighting::getLanguageCost(weighting, correctionT ype,
85 traverseSession, parentDicNode, dicNode, multiBigramMap);
86 const ErrorTypeUtils::ErrorType errorType = weighting->getErrorType(correcti onType,
87 traverseSession, parentDicNode, dicNode);
88 profile(correctionType, dicNode);
89 if (inputStateG.mNeedsToUpdateInputStateG) {
90 dicNode->updateInputIndexG(&inputStateG);
91 } else {
92 dicNode->forwardInputIndex(0, getForwardInputCount(correctionType),
93 (correctionType == CT_TRANSPOSITION));
94 }
95 dicNode->addCost(spatialCost, languageCost, weighting->needsToNormalizeCompo undDistance(),
96 inputSize, errorType);
97 if (CT_NEW_WORD_SPACE_OMISSION == correctionType) {
98 // When we are on a terminal, we save the current distance for evaluatin g
99 // when to auto-commit partial suggestions.
100 dicNode->saveNormalizedCompoundDistanceAfterFirstWordIfNoneYet();
101 }
102 }
103
104 /* static */ float Weighting::getSpatialCost(const Weighting *const weighting,
105 const CorrectionType correctionType, const DicTraverseSession *const tra verseSession,
106 const DicNode *const parentDicNode, const DicNode *const dicNode,
107 DicNode_InputStateG *const inputStateG) {
108 switch(correctionType) {
109 case CT_OMISSION:
110 return weighting->getOmissionCost(parentDicNode, dicNode);
111 case CT_ADDITIONAL_PROXIMITY:
112 // only used for typing
113 return weighting->getAdditionalProximityCost();
114 case CT_SUBSTITUTION:
115 // only used for typing
116 return weighting->getSubstitutionCost();
117 case CT_NEW_WORD_SPACE_OMISSION:
118 return weighting->getNewWordSpatialCost(traverseSession, dicNode, inputS tateG);
119 case CT_MATCH:
120 return weighting->getMatchedCost(traverseSession, dicNode, inputStateG);
121 case CT_COMPLETION:
122 return weighting->getCompletionCost(traverseSession, dicNode);
123 case CT_TERMINAL:
124 return weighting->getTerminalSpatialCost(traverseSession, dicNode);
125 case CT_TERMINAL_INSERTION:
126 return weighting->getTerminalInsertionCost(traverseSession, dicNode);
127 case CT_NEW_WORD_SPACE_SUBSTITUTION:
128 return weighting->getSpaceSubstitutionCost(traverseSession, dicNode);
129 case CT_INSERTION:
130 return weighting->getInsertionCost(traverseSession, parentDicNode, dicNo de);
131 case CT_TRANSPOSITION:
132 return weighting->getTranspositionCost(traverseSession, parentDicNode, d icNode);
133 default:
134 return 0.0f;
135 }
136 }
137
138 /* static */ float Weighting::getLanguageCost(const Weighting *const weighting,
139 const CorrectionType correctionType, const DicTraverseSession *const tra verseSession,
140 const DicNode *const parentDicNode, const DicNode *const dicNode,
141 MultiBigramMap *const multiBigramMap) {
142 switch(correctionType) {
143 case CT_OMISSION:
144 return 0.0f;
145 case CT_SUBSTITUTION:
146 return 0.0f;
147 case CT_NEW_WORD_SPACE_OMISSION:
148 return weighting->getNewWordBigramLanguageCost(
149 traverseSession, parentDicNode, multiBigramMap);
150 case CT_MATCH:
151 return 0.0f;
152 case CT_COMPLETION:
153 return 0.0f;
154 case CT_TERMINAL: {
155 const float languageImprobability =
156 DicNodeUtils::getBigramNodeImprobability(
157 traverseSession->getDictionaryStructurePolicy(), dicNode , multiBigramMap);
158 return weighting->getTerminalLanguageCost(traverseSession, dicNode, lang uageImprobability);
159 }
160 case CT_TERMINAL_INSERTION:
161 return 0.0f;
162 case CT_NEW_WORD_SPACE_SUBSTITUTION:
163 return weighting->getNewWordBigramLanguageCost(
164 traverseSession, parentDicNode, multiBigramMap);
165 case CT_INSERTION:
166 return 0.0f;
167 case CT_TRANSPOSITION:
168 return 0.0f;
169 default:
170 return 0.0f;
171 }
172 }
173
174 /* static */ int Weighting::getForwardInputCount(const CorrectionType correction Type) {
175 switch(correctionType) {
176 case CT_OMISSION:
177 return 0;
178 case CT_ADDITIONAL_PROXIMITY:
179 return 0; /* 0 because CT_MATCH will be called */
180 case CT_SUBSTITUTION:
181 return 0; /* 0 because CT_MATCH will be called */
182 case CT_NEW_WORD_SPACE_OMISSION:
183 return 0;
184 case CT_MATCH:
185 return 1;
186 case CT_COMPLETION:
187 return 1;
188 case CT_TERMINAL:
189 return 0;
190 case CT_TERMINAL_INSERTION:
191 return 1;
192 case CT_NEW_WORD_SPACE_SUBSTITUTION:
193 return 1;
194 case CT_INSERTION:
195 return 2; /* look ahead + skip the current char */
196 case CT_TRANSPOSITION:
197 return 2; /* look ahead + skip the current char */
198 default:
199 return 0;
200 }
201 }
202 } // namespace latinime
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698