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

Commit 537f6eea authored by Keisuke Kuroyanagi's avatar Keisuke Kuroyanagi
Browse files

Use WordIdArrayView for prevWordIds.

Bug: 14425059
Change-Id: Ia84fb997d89564e60111b46ca83bbfa3b187f316
parent a3b0eb16
Loading
Loading
Loading
Loading
+6 −8
Original line number Diff line number Diff line
@@ -105,7 +105,7 @@ class DicNode {
    }

    // Init for root with prevWordIds which is used for n-gram
    void initAsRoot(const int rootPtNodeArrayPos, const int *const prevWordIds) {
    void initAsRoot(const int rootPtNodeArrayPos, const WordIdArrayView prevWordIds) {
        mIsCachedForNextSuggestion = false;
        mDicNodeProperties.init(rootPtNodeArrayPos, prevWordIds);
        mDicNodeState.init();
@@ -115,12 +115,11 @@ class DicNode {
    // Init for root with previous word
    void initAsRootWithPreviousWord(const DicNode *const dicNode, const int rootPtNodeArrayPos) {
        mIsCachedForNextSuggestion = dicNode->mIsCachedForNextSuggestion;
        int newPrevWordIds[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
        WordIdArray<MAX_PREV_WORD_COUNT_FOR_N_GRAM> newPrevWordIds;
        newPrevWordIds[0] = dicNode->mDicNodeProperties.getWordId();
        for (size_t i = 1; i < NELEMS(newPrevWordIds); ++i) {
            newPrevWordIds[i] = dicNode->getPrevWordIds()[i - 1];
        }
        mDicNodeProperties.init(rootPtNodeArrayPos, newPrevWordIds);
        dicNode->getPrevWordIds().limit(newPrevWordIds.size() - 1)
                .copyToArray(&newPrevWordIds, 1 /* offset */);
        mDicNodeProperties.init(rootPtNodeArrayPos, WordIdArrayView::fromArray(newPrevWordIds));
        mDicNodeState.initAsRootWithPreviousWord(&dicNode->mDicNodeState,
                dicNode->mDicNodeProperties.getDepth());
        PROF_NODE_COPY(&dicNode->mProfiler, mProfiler);
@@ -203,8 +202,7 @@ class DicNode {
        return mDicNodeProperties.getWordId();
    }

    // TODO: Use view class to return word id array.
    const int *getPrevWordIds() const {
    const WordIdArrayView getPrevWordIds() const {
        return mDicNodeProperties.getPrevWordIds();
    }

+1 −1
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ namespace latinime {

/* static */ void DicNodeUtils::initAsRoot(
        const DictionaryStructureWithBufferPolicy *const dictionaryStructurePolicy,
        const int *const prevWordIds, DicNode *const newRootDicNode) {
        const WordIdArrayView prevWordIds, DicNode *const newRootDicNode) {
    newRootDicNode->initAsRoot(dictionaryStructurePolicy->getRootPosition(), prevWordIds);
}

+2 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#define LATINIME_DIC_NODE_UTILS_H

#include "defines.h"
#include "utils/int_array_view.h"

namespace latinime {

@@ -30,7 +31,7 @@ class DicNodeUtils {
 public:
    static void initAsRoot(
            const DictionaryStructureWithBufferPolicy *const dictionaryStructurePolicy,
            const int *const prevWordIds, DicNode *const newRootDicNode);
            const WordIdArrayView prevWordIds, DicNode *const newRootDicNode);
    static void initAsRootWithPreviousWord(
            const DictionaryStructureWithBufferPolicy *const dictionaryStructurePolicy,
            const DicNode *const prevWordLastDicNode, DicNode *const newRootDicNode);
+13 −9
Original line number Diff line number Diff line
@@ -18,8 +18,10 @@
#define LATINIME_DIC_NODE_PROPERTIES_H

#include <cstdint>
#include <cstdlib>

#include "defines.h"
#include "utils/int_array_view.h"

namespace latinime {

@@ -36,23 +38,23 @@ class DicNodeProperties {

    // Should be called only once per DicNode is initialized.
    void init(const int childrenPos, const int nodeCodePoint, const int wordId,
            const uint16_t depth, const uint16_t leavingDepth, const int *const prevWordIds) {
            const uint16_t depth, const uint16_t leavingDepth, const WordIdArrayView prevWordIds) {
        mChildrenPtNodeArrayPos = childrenPos;
        mDicNodeCodePoint = nodeCodePoint;
        mWordId = wordId;
        mDepth = depth;
        mLeavingDepth = leavingDepth;
        memmove(mPrevWordIds, prevWordIds, sizeof(mPrevWordIds));
        prevWordIds.copyToArray(&mPrevWordIds, 0 /* offset */);
    }

    // Init for root with prevWordsPtNodePos which is used for n-gram
    void init(const int rootPtNodeArrayPos, const int *const prevWordIds) {
    void init(const int rootPtNodeArrayPos, const WordIdArrayView prevWordIds) {
        mChildrenPtNodeArrayPos = rootPtNodeArrayPos;
        mDicNodeCodePoint = NOT_A_CODE_POINT;
        mWordId = NOT_A_WORD_ID;
        mDepth = 0;
        mLeavingDepth = 0;
        memmove(mPrevWordIds, prevWordIds, sizeof(mPrevWordIds));
        prevWordIds.copyToArray(&mPrevWordIds, 0 /* offset */);
    }

    void initByCopy(const DicNodeProperties *const dicNodeProp) {
@@ -61,7 +63,8 @@ class DicNodeProperties {
        mWordId = dicNodeProp->mWordId;
        mDepth = dicNodeProp->mDepth;
        mLeavingDepth = dicNodeProp->mLeavingDepth;
        memmove(mPrevWordIds, dicNodeProp->mPrevWordIds, sizeof(mPrevWordIds));
        WordIdArrayView::fromArray(dicNodeProp->mPrevWordIds)
                .copyToArray(&mPrevWordIds, 0 /* offset */);
    }

    // Init as passing child
@@ -71,7 +74,8 @@ class DicNodeProperties {
        mWordId = dicNodeProp->mWordId;
        mDepth = dicNodeProp->mDepth + 1; // Increment the depth of a passing child
        mLeavingDepth = dicNodeProp->mLeavingDepth;
        memmove(mPrevWordIds, dicNodeProp->mPrevWordIds, sizeof(mPrevWordIds));
        WordIdArrayView::fromArray(dicNodeProp->mPrevWordIds)
                .copyToArray(&mPrevWordIds, 0 /* offset */);
    }

    int getChildrenPtNodeArrayPos() const {
@@ -99,8 +103,8 @@ class DicNodeProperties {
        return (mChildrenPtNodeArrayPos != NOT_A_DICT_POS) || mDepth != mLeavingDepth;
    }

    const int *getPrevWordIds() const {
        return mPrevWordIds;
    const WordIdArrayView getPrevWordIds() const {
        return WordIdArrayView::fromArray(mPrevWordIds);
    }

    int getWordId() const {
@@ -116,7 +120,7 @@ class DicNodeProperties {
    int mWordId;
    uint16_t mDepth;
    uint16_t mLeavingDepth;
    int mPrevWordIds[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
    WordIdArray<MAX_PREV_WORD_COUNT_FOR_N_GRAM> mPrevWordIds;
};
} // namespace latinime
#endif // LATINIME_DIC_NODE_PROPERTIES_H
+11 −11
Original line number Diff line number Diff line
@@ -85,7 +85,7 @@ void Dictionary::NgramListenerForPrediction::onVisitEntry(const int ngramProbabi
        return;
    }
    const WordAttributes wordAttributes = mDictStructurePolicy->getWordAttributesInContext(
            mPrevWordIds.data(), targetWordId, nullptr /* multiBigramMap */);
            mPrevWordIds, targetWordId, nullptr /* multiBigramMap */);
    mSuggestionResults->addPrediction(targetWordCodePoints, codePointCount,
            wordAttributes.getProbability());
}
@@ -93,13 +93,13 @@ void Dictionary::NgramListenerForPrediction::onVisitEntry(const int ngramProbabi
void Dictionary::getPredictions(const PrevWordsInfo *const prevWordsInfo,
        SuggestionResults *const outSuggestionResults) const {
    TimeKeeper::setCurrentTime();
    int prevWordIds[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
    prevWordsInfo->getPrevWordIds(mDictionaryStructureWithBufferPolicy.get(), prevWordIds,
    WordIdArray<MAX_PREV_WORD_COUNT_FOR_N_GRAM> prevWordIds;
    prevWordsInfo->getPrevWordIds(mDictionaryStructureWithBufferPolicy.get(), prevWordIds.data(),
            true /* tryLowerCaseSearch */);
    NgramListenerForPrediction listener(prevWordsInfo,
            WordIdArrayView::fromFixedSizeArray(prevWordIds), outSuggestionResults,
    const WordIdArrayView prevWordIdArrayView = WordIdArrayView::fromArray(prevWordIds);
    NgramListenerForPrediction listener(prevWordsInfo, prevWordIdArrayView, outSuggestionResults,
            mDictionaryStructureWithBufferPolicy.get());
    mDictionaryStructureWithBufferPolicy->iterateNgramEntries(prevWordIds, &listener);
    mDictionaryStructureWithBufferPolicy->iterateNgramEntries(prevWordIdArrayView, &listener);
}

int Dictionary::getProbability(const int *word, int length) const {
@@ -119,13 +119,13 @@ int Dictionary::getNgramProbability(const PrevWordsInfo *const prevWordsInfo, co
            CodePointArrayView(word, length), false /* forceLowerCaseSearch */);
    if (wordId == NOT_A_WORD_ID) return NOT_A_PROBABILITY;
    if (!prevWordsInfo) {
        return getDictionaryStructurePolicy()->getProbabilityOfWord(
                nullptr /* prevWordsPtNodePos */, wordId);
        return getDictionaryStructurePolicy()->getProbabilityOfWord(WordIdArrayView(), wordId);
    }
    int prevWordIds[MAX_PREV_WORD_COUNT_FOR_N_GRAM];
    prevWordsInfo->getPrevWordIds(mDictionaryStructureWithBufferPolicy.get(), prevWordIds,
    WordIdArray<MAX_PREV_WORD_COUNT_FOR_N_GRAM> prevWordIds;
    prevWordsInfo->getPrevWordIds(mDictionaryStructureWithBufferPolicy.get(), prevWordIds.data(),
            true /* tryLowerCaseSearch */);
    return getDictionaryStructurePolicy()->getProbabilityOfWord(prevWordIds, wordId);
    return getDictionaryStructurePolicy()->getProbabilityOfWord(
            IntArrayView::fromArray(prevWordIds), wordId);
}

bool Dictionary::addUnigramEntry(const int *const word, const int length,
Loading