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

Commit b0097395 authored by Keisuke Kuroyanagi's avatar Keisuke Kuroyanagi
Browse files

Get bigrams iterator via dict structure policy.

Bug: 14425059
Change-Id: Ie4c6afbb6a3b707b5aa8e9e4f941c9da6e6bcdbf
parent c495c5bd
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