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

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

Merge "Implement Ver4PatriciaTriePolicy::getNextWordAndNextToken."

parents 96aee22e 94173469
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -357,7 +357,7 @@ public final class BinaryDictionary extends Dictionary {
        while (len < MAX_WORD_LENGTH && codePoints[len] != 0) {
            ++len;
        }
        final String word = new String(mOutputCodePoints, 0, len);
        final String word = new String(codePoints, 0, len);
        return new GetNextWordPropertyResult(getWordProperty(word), nextToken);
    }

+8 −0
Original line number Diff line number Diff line
@@ -28,6 +28,14 @@ const int DynamicPtReadingHelper::MAX_CHILD_COUNT_TO_AVOID_INFINITE_LOOP = 10000
const int DynamicPtReadingHelper::MAX_PT_NODE_ARRAY_COUNT_TO_AVOID_INFINITE_LOOP = 100000;
const size_t DynamicPtReadingHelper::MAX_READING_STATE_STACK_SIZE = MAX_WORD_LENGTH;

bool DynamicPtReadingHelper::TraversePolicyToGetAllTerminalPtNodePositions::onVisitingPtNode(
        const PtNodeParams *const ptNodeParams) {
    if (ptNodeParams->isTerminal() && !ptNodeParams->isDeleted()) {
        mTerminalPositions->push_back(ptNodeParams->getHeadPos());
    }
    return true;
}

// Visits all PtNodes in post-order depth first manner.
// For example, visits c -> b -> y -> x -> a for the following dictionary:
// a _ b _ c
+15 −0
Original line number Diff line number Diff line
@@ -59,6 +59,21 @@ class DynamicPtReadingHelper {
        DISALLOW_COPY_AND_ASSIGN(TraversingEventListener);
    };

    class TraversePolicyToGetAllTerminalPtNodePositions : public TraversingEventListener {
     public:
        TraversePolicyToGetAllTerminalPtNodePositions(std::vector<int> *const terminalPositions)
                : mTerminalPositions(terminalPositions) {}
        bool onAscend() { return true; }
        bool onDescend(const int ptNodeArrayPos) { return true; }
        bool onReadingPtNodeArrayTail() { return true; }
        bool onVisitingPtNode(const PtNodeParams *const ptNodeParams);

     private:
        DISALLOW_IMPLICIT_CONSTRUCTORS(TraversePolicyToGetAllTerminalPtNodePositions);

        std::vector<int> *const mTerminalPositions;
    };

    DynamicPtReadingHelper(const BufferWithExtendableBuffer *const buffer,
            const PtNodeReader *const ptNodeReader)
            : mIsError(false), mReadingState(), mBuffer(buffer),
+26 −4
Original line number Diff line number Diff line
@@ -392,10 +392,32 @@ const WordProperty Ver4PatriciaTriePolicy::getWordProperty(const int *const code
            historicalInfo->getCount(), &bigrams, &shortcuts);
}

int Ver4PatriciaTriePolicy::getNextWordAndNextToken(const int token,
        int *const outCodePoints) {
    // TODO: Implement.
int Ver4PatriciaTriePolicy::getNextWordAndNextToken(const int token, int *const outCodePoints) {
    if (token == 0) {
        mTerminalPtNodePositionsForIteratingWords.clear();
        DynamicPtReadingHelper::TraversePolicyToGetAllTerminalPtNodePositions traversePolicy(
                &mTerminalPtNodePositionsForIteratingWords);
        DynamicPtReadingHelper readingHelper(mDictBuffer, &mNodeReader);
        readingHelper.initWithPtNodeArrayPos(getRootPosition());
        readingHelper.traverseAllPtNodesInPostorderDepthFirstManner(&traversePolicy);
    }
    const int terminalPtNodePositionsVectorSize =
            static_cast<int>(mTerminalPtNodePositionsForIteratingWords.size());
    if (token < 0 || token >= terminalPtNodePositionsVectorSize) {
        AKLOGE("Given token %d is invalid.", token);
        return 0;
    }
    const int terminalPtNodePos = mTerminalPtNodePositionsForIteratingWords[token];
    int unigramProbability = NOT_A_PROBABILITY;
    getCodePointsAndProbabilityAndReturnCodePointCount(terminalPtNodePos, MAX_WORD_LENGTH,
            outCodePoints, &unigramProbability);
    const int nextToken = token + 1;
    if (nextToken >= terminalPtNodePositionsVectorSize) {
        // All words have been iterated.
        mTerminalPtNodePositionsForIteratingWords.clear();
        return 0;
    }
    return nextToken;
}

} // namespace latinime
+5 −1
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
#ifndef LATINIME_VER4_PATRICIA_TRIE_POLICY_H
#define LATINIME_VER4_PATRICIA_TRIE_POLICY_H

#include <vector>

#include "defines.h"
#include "suggest/core/policy/dictionary_structure_with_buffer_policy.h"
#include "suggest/policyimpl/dictionary/bigram/ver4_bigram_list_policy.h"
@@ -50,7 +52,8 @@ class Ver4PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
              mUpdatingHelper(mDictBuffer, &mNodeReader, &mNodeWriter),
              mWritingHelper(mBuffers.get()),
              mUnigramCount(mHeaderPolicy->getUnigramCount()),
              mBigramCount(mHeaderPolicy->getBigramCount()) {};
              mBigramCount(mHeaderPolicy->getBigramCount()),
              mTerminalPtNodePositionsForIteratingWords() {};

    AK_FORCE_INLINE int getRootPosition() const {
        return 0;
@@ -134,6 +137,7 @@ class Ver4PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy {
    Ver4PatriciaTrieWritingHelper mWritingHelper;
    int mUnigramCount;
    int mBigramCount;
    std::vector<int> mTerminalPtNodePositionsForIteratingWords;
};
} // namespace latinime
#endif // LATINIME_VER4_PATRICIA_TRIE_POLICY_H
Loading