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