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

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

Merge "Get bigrams iterator via dict structure policy."

parents 1c9e9ecd b0097395
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -24,6 +24,11 @@ namespace latinime {

class BinaryDictionaryBigramsIterator {
 public:
    // Empty iterator.
    BinaryDictionaryBigramsIterator()
           : mBigramsStructurePolicy(nullptr), mPos(NOT_A_DICT_POS),
             mBigramPos(NOT_A_DICT_POS), mProbability(NOT_A_PROBABILITY), mHasNext(false) {}

    BinaryDictionaryBigramsIterator(
            const DictionaryBigramsStructurePolicy *const bigramsStructurePolicy, const int pos)
            : mBigramsStructurePolicy(bigramsStructurePolicy), mPos(pos),
+4 −6
Original line number Diff line number Diff line
@@ -53,9 +53,8 @@ int MultiBigramMap::getBigramProbability(

void MultiBigramMap::BigramMap::init(
        const DictionaryStructureWithBufferPolicy *const structurePolicy, const int nodePos) {
    const int bigramsListPos = structurePolicy->getBigramsPositionOfPtNode(nodePos);
    BinaryDictionaryBigramsIterator bigramsIt(structurePolicy->getBigramsStructurePolicy(),
            bigramsListPos);
    BinaryDictionaryBigramsIterator bigramsIt =
            structurePolicy->getBigramsIteratorOfPtNode(nodePos);
    while (bigramsIt.hasNext()) {
        bigramsIt.next();
        if (bigramsIt.getBigramPos() == NOT_A_DICT_POS) {
@@ -89,9 +88,8 @@ int MultiBigramMap::readBigramProbabilityFromBinaryDictionary(
        const DictionaryStructureWithBufferPolicy *const structurePolicy, const int nodePos,
        const int nextWordPosition, const int unigramProbability) {
    int bigramProbability = NOT_A_PROBABILITY;
    const int bigramsListPos = structurePolicy->getBigramsPositionOfPtNode(nodePos);
    BinaryDictionaryBigramsIterator bigramsIt(structurePolicy->getBigramsStructurePolicy(),
            bigramsListPos);
    BinaryDictionaryBigramsIterator bigramsIt =
            structurePolicy->getBigramsIteratorOfPtNode(nodePos);
    while (bigramsIt.hasNext()) {
        bigramsIt.next();
        if (bigramsIt.getBigramPos() == nextWordPosition) {
+2 −3
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <memory>

#include "defines.h"
#include "suggest/core/dictionary/binary_dictionary_bigrams_iterator.h"
#include "suggest/core/dictionary/property/word_property.h"

namespace latinime {
@@ -61,12 +62,10 @@ class DictionaryStructureWithBufferPolicy {

    virtual int getShortcutPositionOfPtNode(const int nodePos) const = 0;

    virtual int getBigramsPositionOfPtNode(const int nodePos) const = 0;
    virtual BinaryDictionaryBigramsIterator getBigramsIteratorOfPtNode(const int nodePos) const = 0;

    virtual const DictionaryHeaderStructurePolicy *getHeaderStructurePolicy() const = 0;

    virtual const DictionaryBigramsStructurePolicy *getBigramsStructurePolicy() const = 0;

    virtual const DictionaryShortcutsStructurePolicy *getShortcutsStructurePolicy() const = 0;

    // Returns whether the update was success or not.
+18 −20
Original line number Diff line number Diff line
@@ -92,11 +92,9 @@ class PrevWordsInfo {

    BinaryDictionaryBigramsIterator getBigramsIteratorForPrediction(
            const DictionaryStructureWithBufferPolicy *const dictStructurePolicy) const {
        const int bigramListPos = getBigramListPositionForWordWithTryingLowerCaseSearch(
        return getBigramsIteratorForWordWithTryingLowerCaseSearch(
                dictStructurePolicy, mPrevWordCodePoints[0], mPrevWordCodePointCount[0],
                mIsBeginningOfSentence[0]);
        return BinaryDictionaryBigramsIterator(dictStructurePolicy->getBigramsStructurePolicy(),
                bigramListPos);
    }

    // n is 1-indexed.
@@ -156,12 +154,12 @@ class PrevWordsInfo {
                codePoints, codePointCount, true /* forceLowerCaseSearch */);
    }

    static int getBigramListPositionForWordWithTryingLowerCaseSearch(
    static BinaryDictionaryBigramsIterator getBigramsIteratorForWordWithTryingLowerCaseSearch(
            const DictionaryStructureWithBufferPolicy *const dictStructurePolicy,
            const int *const wordCodePoints, const int wordCodePointCount,
            const bool isBeginningOfSentence) {
        if (!dictStructurePolicy || !wordCodePoints || wordCodePointCount > MAX_WORD_LENGTH) {
            return NOT_A_DICT_POS;
            return BinaryDictionaryBigramsIterator();
        }
        int codePoints[MAX_WORD_LENGTH];
        int codePointCount = wordCodePointCount;
@@ -170,30 +168,30 @@ class PrevWordsInfo {
            codePointCount = CharUtils::attachBeginningOfSentenceMarker(codePoints,
                    codePointCount, MAX_WORD_LENGTH);
            if (codePointCount <= 0) {
                return NOT_A_DICT_POS;
                return BinaryDictionaryBigramsIterator();
            }
        }
        int pos = getBigramListPositionForWord(dictStructurePolicy, codePoints,
                codePointCount, false /* forceLowerCaseSearch */);
        // getBigramListPositionForWord returns NOT_A_DICT_POS if this word isn't in the
        // dictionary or has no bigrams
        if (NOT_A_DICT_POS == pos) {
        BinaryDictionaryBigramsIterator bigramsIt = getBigramsIteratorForWord(dictStructurePolicy,
                codePoints, codePointCount, false /* forceLowerCaseSearch */);
        // getBigramsIteratorForWord returns an empty iterator if this word isn't in the dictionary
        // or has no bigrams.
        if (bigramsIt.hasNext()) {
            return bigramsIt;
        }
        // If no bigrams for this exact word, search again in lower case.
            pos = getBigramListPositionForWord(dictStructurePolicy, codePoints,
        return getBigramsIteratorForWord(dictStructurePolicy, codePoints,
                codePointCount, true /* forceLowerCaseSearch */);
    }
        return pos;
    }

    static int getBigramListPositionForWord(
    static BinaryDictionaryBigramsIterator getBigramsIteratorForWord(
            const DictionaryStructureWithBufferPolicy *const dictStructurePolicy,
            const int *wordCodePoints, const int wordCodePointCount,
            const bool forceLowerCaseSearch) {
        if (!wordCodePoints || wordCodePointCount <= 0) return NOT_A_DICT_POS;
        if (!wordCodePoints || wordCodePointCount <= 0) return BinaryDictionaryBigramsIterator();
        const int terminalPtNodePos = dictStructurePolicy->getTerminalPtNodePositionOfWord(
                wordCodePoints, wordCodePointCount, forceLowerCaseSearch);
        if (NOT_A_DICT_POS == terminalPtNodePos) return NOT_A_DICT_POS;
        return dictStructurePolicy->getBigramsPositionOfPtNode(terminalPtNodePos);
        if (NOT_A_DICT_POS == terminalPtNodePos) return BinaryDictionaryBigramsIterator();
        return dictStructurePolicy->getBigramsIteratorOfPtNode(terminalPtNodePos);
    }

    void clear() {
+6 −0
Original line number Diff line number Diff line
@@ -154,6 +154,12 @@ int Ver4PatriciaTriePolicy::getShortcutPositionOfPtNode(const int ptNodePos) con
            ptNodeParams.getTerminalId());
}

BinaryDictionaryBigramsIterator Ver4PatriciaTriePolicy::getBigramsIteratorOfPtNode(
        const int ptNodePos) const {
    const int bigramsPosition = getBigramsPositionOfPtNode(ptNodePos);
    return BinaryDictionaryBigramsIterator(&mBigramPolicy, bigramsPosition);
}

int Ver4PatriciaTriePolicy::getBigramsPositionOfPtNode(const int ptNodePos) const {
    if (ptNodePos == NOT_A_DICT_POS) {
        return NOT_A_DICT_POS;
Loading