Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 53da06b8 authored by Keisuke Kuroyanagi's avatar Keisuke Kuroyanagi Committed by Android (Google) Code Review
Browse files

Merge "Use MultiBigramMap in structure policy."

parents 89e34169 9f8da0f8
Loading
Loading
Loading
Loading
+2 −16
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@

#include "suggest/core/dicnode/dic_node.h"
#include "suggest/core/dicnode/dic_node_vector.h"
#include "suggest/core/dictionary/multi_bigram_map.h"
#include "suggest/core/policy/dictionary_structure_with_buffer_policy.h"

namespace latinime {
@@ -73,25 +72,12 @@ namespace latinime {
    if (dicNode->hasMultipleWords() && !dicNode->isValidMultipleWordSuggestion()) {
        return static_cast<float>(MAX_VALUE_FOR_WEIGHTING);
    }
    const int probability = getBigramNodeProbability(dictionaryStructurePolicy, dicNode,
            multiBigramMap);
    const int probability = dictionaryStructurePolicy->getProbabilityOfWordInContext(
            dicNode->getPrevWordIds(), dicNode->getWordId(), multiBigramMap);
    // TODO: This equation to calculate the improbability looks unreasonable.  Investigate this.
    const float cost = static_cast<float>(MAX_PROBABILITY - probability)
            / static_cast<float>(MAX_PROBABILITY);
    return cost;
}

/* static */ int DicNodeUtils::getBigramNodeProbability(
        const DictionaryStructureWithBufferPolicy *const dictionaryStructurePolicy,
        const DicNode *const dicNode, MultiBigramMap *const multiBigramMap) {
    const int unigramProbability = dicNode->getUnigramProbability();
    if (multiBigramMap) {
        const int *const prevWordIds = dicNode->getPrevWordIds();
        return multiBigramMap->getBigramProbability(dictionaryStructurePolicy,
                prevWordIds, dicNode->getWordId(), unigramProbability);
    }
    return dictionaryStructurePolicy->getProbability(unigramProbability,
            NOT_A_PROBABILITY);
}

} // namespace latinime
+0 −4
Original line number Diff line number Diff line
@@ -46,10 +46,6 @@ class DicNodeUtils {
    DISALLOW_IMPLICIT_CONSTRUCTORS(DicNodeUtils);
    // Max number of bigrams to look up
    static const int MAX_BIGRAMS_CONSIDERED_PER_CONTEXT = 500;

    static int getBigramNodeProbability(
            const DictionaryStructureWithBufferPolicy *const dictionaryStructurePolicy,
            const DicNode *const dicNode, MultiBigramMap *const multiBigramMap);
};
} // namespace latinime
#endif // LATINIME_DIC_NODE_UTILS_H
+5 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ namespace latinime {
class DicNode;
class DicNodeVector;
class DictionaryHeaderStructurePolicy;
class MultiBigramMap;
class NgramListener;
class PrevWordsInfo;
class UnigramProperty;
@@ -56,6 +57,10 @@ class DictionaryStructureWithBufferPolicy {
    virtual int getWordId(const CodePointArrayView wordCodePoints,
            const bool forceLowerCaseSearch) const = 0;

    virtual int getProbabilityOfWordInContext(const int *const prevWordIds, const int wordId,
            MultiBigramMap *const multiBigramMap) const = 0;

    // TODO: Remove
    virtual int getProbability(const int unigramProbability, const int bigramProbability) const = 0;

    virtual int getProbabilityOfWord(const int *const prevWordIds, const int wordId) const = 0;
+21 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@

#include "suggest/core/dicnode/dic_node.h"
#include "suggest/core/dicnode/dic_node_vector.h"
#include "suggest/core/dictionary/multi_bigram_map.h"
#include "suggest/core/dictionary/ngram_listener.h"
#include "suggest/core/dictionary/property/bigram_property.h"
#include "suggest/core/dictionary/property/unigram_property.h"
@@ -117,6 +118,26 @@ int Ver4PatriciaTriePolicy::getWordId(const CodePointArrayView wordCodePoints,
    return getWordIdFromTerminalPtNodePos(ptNodePos);
}

int Ver4PatriciaTriePolicy::getProbabilityOfWordInContext(const int *const prevWordIds,
        const int wordId, MultiBigramMap *const multiBigramMap) const {
    if (wordId == NOT_A_WORD_ID) {
        return NOT_A_PROBABILITY;
    }
    const int ptNodePos = getTerminalPtNodePosFromWordId(wordId);
    const PtNodeParams ptNodeParams(mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos));
    if (multiBigramMap) {
        return multiBigramMap->getBigramProbability(this /* structurePolicy */, prevWordIds,
                wordId, ptNodeParams.getProbability());
    }
    if (prevWordIds) {
        const int probability = getProbabilityOfWord(prevWordIds, wordId);
        if (probability != NOT_A_PROBABILITY) {
            return probability;
        }
    }
    return getProbability(ptNodeParams.getProbability(), NOT_A_PROBABILITY);
}

int Ver4PatriciaTriePolicy::getProbability(const int unigramProbability,
        const int bigramProbability) const {
    if (mHeaderPolicy->isDecayingDict()) {
+3 −0
Original line number Diff line number Diff line
@@ -91,6 +91,9 @@ class Ver4PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {

    int getWordId(const CodePointArrayView wordCodePoints, const bool forceLowerCaseSearch) const;

    int getProbabilityOfWordInContext(const int *const prevWordIds, const int wordId,
            MultiBigramMap *const multiBigramMap) const;

    int getProbability(const int unigramProbability, const int bigramProbability) const;

    int getProbabilityOfWord(const int *const prevWordIds, const int wordId) const;
Loading