dic_node_utils.cpp revision 9f8da0f833c7aab226ed0b93ab6c546380b068bb
1/* 2 * Copyright (C) 2012 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/dicnode/dic_node_utils.h" 18 19#include "suggest/core/dicnode/dic_node.h" 20#include "suggest/core/dicnode/dic_node_vector.h" 21#include "suggest/core/policy/dictionary_structure_with_buffer_policy.h" 22 23namespace latinime { 24 25/////////////////////////////// 26// Node initialization utils // 27/////////////////////////////// 28 29/* static */ void DicNodeUtils::initAsRoot( 30 const DictionaryStructureWithBufferPolicy *const dictionaryStructurePolicy, 31 const int *const prevWordIds, DicNode *const newRootDicNode) { 32 newRootDicNode->initAsRoot(dictionaryStructurePolicy->getRootPosition(), prevWordIds); 33} 34 35/*static */ void DicNodeUtils::initAsRootWithPreviousWord( 36 const DictionaryStructureWithBufferPolicy *const dictionaryStructurePolicy, 37 const DicNode *const prevWordLastDicNode, DicNode *const newRootDicNode) { 38 newRootDicNode->initAsRootWithPreviousWord( 39 prevWordLastDicNode, dictionaryStructurePolicy->getRootPosition()); 40} 41 42/* static */ void DicNodeUtils::initByCopy(const DicNode *const srcDicNode, 43 DicNode *const destDicNode) { 44 destDicNode->initByCopy(srcDicNode); 45} 46 47/////////////////////////////////// 48// Traverse node expansion utils // 49/////////////////////////////////// 50/* static */ void DicNodeUtils::getAllChildDicNodes(const DicNode *dicNode, 51 const DictionaryStructureWithBufferPolicy *const dictionaryStructurePolicy, 52 DicNodeVector *const childDicNodes) { 53 if (dicNode->isTotalInputSizeExceedingLimit()) { 54 return; 55 } 56 if (!dicNode->isLeavingNode()) { 57 childDicNodes->pushPassingChild(dicNode); 58 } else { 59 dictionaryStructurePolicy->createAndGetAllChildDicNodes(dicNode, childDicNodes); 60 } 61} 62 63/////////////////// 64// Scoring utils // 65/////////////////// 66/** 67 * Computes the combined bigram / unigram cost for the given dicNode. 68 */ 69/* static */ float DicNodeUtils::getBigramNodeImprobability( 70 const DictionaryStructureWithBufferPolicy *const dictionaryStructurePolicy, 71 const DicNode *const dicNode, MultiBigramMap *const multiBigramMap) { 72 if (dicNode->hasMultipleWords() && !dicNode->isValidMultipleWordSuggestion()) { 73 return static_cast<float>(MAX_VALUE_FOR_WEIGHTING); 74 } 75 const int probability = dictionaryStructurePolicy->getProbabilityOfWordInContext( 76 dicNode->getPrevWordIds(), dicNode->getWordId(), multiBigramMap); 77 // TODO: This equation to calculate the improbability looks unreasonable. Investigate this. 78 const float cost = static_cast<float>(MAX_PROBABILITY - probability) 79 / static_cast<float>(MAX_PROBABILITY); 80 return cost; 81} 82 83} // namespace latinime 84