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

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

Merge "Implement addBigramWords() for DynamicPatriciaTrie."

parents fc51a820 cd6a0430
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -62,6 +62,11 @@ public:
       return flags | FLAG_ATTRIBUTE_HAS_NEXT;
       return flags | FLAG_ATTRIBUTE_HAS_NEXT;
   }
   }


   static AK_FORCE_INLINE BigramFlags setProbabilityInFlags(const BigramFlags flags,
           const int probability) {
       return (flags & (~MASK_ATTRIBUTE_PROBABILITY)) | (probability & MASK_ATTRIBUTE_PROBABILITY);
   }

   // Returns true if the bigram entry is valid and put entry values into out*.
   // Returns true if the bigram entry is valid and put entry values into out*.
   static AK_FORCE_INLINE bool createBigramEntryAndGetFlagsAndOffsetAndOffsetFieldSize(
   static AK_FORCE_INLINE bool createBigramEntryAndGetFlagsAndOffsetAndOffsetFieldSize(
           const int entryPos, const int targetPos, const int probability, const bool hasNext,
           const int entryPos, const int targetPos, const int probability, const bool hasNext,
+39 −27
Original line number Original line Diff line number Diff line
@@ -98,8 +98,8 @@ bool DynamicBigramListPolicy::copyAllBigrams(int *const fromPos, int *const toPo
    return true;
    return true;
}
}


bool DynamicBigramListPolicy::addBigramEntry(const int bigramPos, const int probability,
bool DynamicBigramListPolicy::addNewBigramEntryToBigramList(const int bigramPos,
        int *const pos) {
        const int probability, int *const pos) {
    const bool usesAdditionalBuffer = mBuffer->isInAdditionalBuffer(*pos);
    const bool usesAdditionalBuffer = mBuffer->isInAdditionalBuffer(*pos);
    if (usesAdditionalBuffer) {
    if (usesAdditionalBuffer) {
        *pos -= mBuffer->getOriginalBufferSize();
        *pos -= mBuffer->getOriginalBufferSize();
@@ -113,7 +113,17 @@ bool DynamicBigramListPolicy::addBigramEntry(const int bigramPos, const int prob
        // The buffer address can be changed after calling buffer writing methods.
        // The buffer address can be changed after calling buffer writing methods.
        const uint8_t *const buffer = mBuffer->getBuffer(usesAdditionalBuffer);
        const uint8_t *const buffer = mBuffer->getBuffer(usesAdditionalBuffer);
        flags = BigramListReadWriteUtils::getFlagsAndForwardPointer(buffer, pos);
        flags = BigramListReadWriteUtils::getFlagsAndForwardPointer(buffer, pos);
        BigramListReadWriteUtils::getBigramAddressAndForwardPointer(buffer, flags, pos);
        int originalBigramPos = BigramListReadWriteUtils::getBigramAddressAndForwardPointer(
                buffer, flags, pos);
        if (usesAdditionalBuffer && originalBigramPos != NOT_A_VALID_WORD_POS) {
            originalBigramPos += mBuffer->getOriginalBufferSize();
        }
        if (followBigramLinkAndGetCurrentBigramPtNodePos(originalBigramPos) == bigramPos) {
            // Update this bigram entry.
            const BigramListReadWriteUtils::BigramFlags updatedFlags =
                    BigramListReadWriteUtils::setProbabilityInFlags(flags, probability);
            return mBuffer->writeUintAndAdvancePosition(updatedFlags, 1 /* size */, &entryPos);
        }
        if (BigramListReadWriteUtils::hasNext(flags)) {
        if (BigramListReadWriteUtils::hasNext(flags)) {
            continue;
            continue;
        }
        }
@@ -124,34 +134,36 @@ bool DynamicBigramListPolicy::addBigramEntry(const int bigramPos, const int prob
        if (!mBuffer->writeUintAndAdvancePosition(updatedFlags, 1 /* size */, &entryPos)) {
        if (!mBuffer->writeUintAndAdvancePosition(updatedFlags, 1 /* size */, &entryPos)) {
            return false;
            return false;
        }
        }
        if (usesAdditionalBuffer) {
            *pos += mBuffer->getOriginalBufferSize();
        }
        // Then, add a new entry after the last entry.
        // Then, add a new entry after the last entry.
        return writeNewBigramEntry(bigramPos, probability, pos);
    } while(BigramListReadWriteUtils::hasNext(flags));
    // We return directly from the while loop.
    ASSERT(false);
    return false;
}

bool DynamicBigramListPolicy::writeNewBigramEntry(const int bigramPos, const int probability,
        int *const writingPos) {
    BigramListReadWriteUtils::BigramFlags newBigramFlags;
    BigramListReadWriteUtils::BigramFlags newBigramFlags;
    uint32_t newBigramOffset;
    uint32_t newBigramOffset;
    int newBigramOffsetFieldSize;
    int newBigramOffsetFieldSize;
    if(!BigramListReadWriteUtils::createBigramEntryAndGetFlagsAndOffsetAndOffsetFieldSize(
    if(!BigramListReadWriteUtils::createBigramEntryAndGetFlagsAndOffsetAndOffsetFieldSize(
                *pos, bigramPos, BigramListReadWriteUtils::getProbabilityFromFlags(flags),
            *writingPos, bigramPos, probability, false /* hasNext */, &newBigramFlags,
                BigramListReadWriteUtils::hasNext(flags), &newBigramFlags, &newBigramOffset,
            &newBigramOffset, &newBigramOffsetFieldSize)) {
                &newBigramOffsetFieldSize)) {
        return false;
            continue;
        }
        int newEntryPos = *pos;
        if (usesAdditionalBuffer) {
            newEntryPos += mBuffer->getOriginalBufferSize();
    }
    }
    // Write bigram flags.
    // Write bigram flags.
        if (!mBuffer->writeUintAndAdvancePosition(newBigramFlags, 1 /* size */,
    if (!mBuffer->writeUintAndAdvancePosition(newBigramFlags, 1 /* size */, writingPos)) {
                &newEntryPos)) {
        return false;
        return false;
    }
    }
    // Write bigram positon offset.
    // Write bigram positon offset.
    if (!mBuffer->writeUintAndAdvancePosition(newBigramOffset, newBigramOffsetFieldSize,
    if (!mBuffer->writeUintAndAdvancePosition(newBigramOffset, newBigramOffsetFieldSize,
                &newEntryPos)) {
            writingPos)) {
        return false;
        return false;
    }
    }
    } while(BigramListReadWriteUtils::hasNext(flags));
    if (usesAdditionalBuffer) {
        *pos += mBuffer->getOriginalBufferSize();
    }
    return true;
    return true;
}
}


+4 −1
Original line number Original line Diff line number Diff line
@@ -48,7 +48,10 @@ class DynamicBigramListPolicy : public DictionaryBigramsStructurePolicy {
    // positions after bigram lists. This method skips invalid bigram entries.
    // positions after bigram lists. This method skips invalid bigram entries.
    bool copyAllBigrams(int *const fromPos, int *const toPos);
    bool copyAllBigrams(int *const fromPos, int *const toPos);


    bool addBigramEntry(const int bigramPos, const int probability, int *const pos);
    bool addNewBigramEntryToBigramList(const int bigramPos, const int probability, int *const pos);

    bool writeNewBigramEntry(const int bigramPos, const int probability,
            int *const writingPos);


    // Return if targetBigramPos is found or not.
    // Return if targetBigramPos is found or not.
    bool removeBigram(const int bigramListPos, const int targetBigramPos);
    bool removeBigram(const int bigramListPos, const int targetBigramPos);
+6 −4
Original line number Original line Diff line number Diff line
@@ -69,11 +69,13 @@ void DynamicPatriciaTrieNodeReader::fetchNodeInfoFromBufferAndProcessMovedNode(c
    if (usesAdditionalBuffer && mChildrenPos != NOT_A_DICT_POS) {
    if (usesAdditionalBuffer && mChildrenPos != NOT_A_DICT_POS) {
        mChildrenPos += mBuffer->getOriginalBufferSize();
        mChildrenPos += mBuffer->getOriginalBufferSize();
    }
    }
    if (mSiblingPos == NOT_A_DICT_POS && DynamicPatriciaTrieReadingUtils::isMoved(mFlags)) {
    if (mSiblingPos == NOT_A_DICT_POS) {
        if (DynamicPatriciaTrieReadingUtils::isMoved(mFlags)) {
            mBigramLinkedNodePos = mChildrenPos;
            mBigramLinkedNodePos = mChildrenPos;
        } else {
        } else {
            mBigramLinkedNodePos = NOT_A_DICT_POS;
            mBigramLinkedNodePos = NOT_A_DICT_POS;
        }
        }
    }
    if (usesAdditionalBuffer) {
    if (usesAdditionalBuffer) {
        pos += mBuffer->getOriginalBufferSize();
        pos += mBuffer->getOriginalBufferSize();
    }
    }
+37 −4
Original line number Original line Diff line number Diff line
@@ -26,6 +26,8 @@


namespace latinime {
namespace latinime {


const int DynamicPatriciaTrieWritingHelper::CHILDREN_POSITION_FIELD_SIZE = 3;

bool DynamicPatriciaTrieWritingHelper::addUnigramWord(
bool DynamicPatriciaTrieWritingHelper::addUnigramWord(
        DynamicPatriciaTrieReadingHelper *const readingHelper,
        DynamicPatriciaTrieReadingHelper *const readingHelper,
        const int *const wordCodePoints, const int codePointCount, const int probability) {
        const int *const wordCodePoints, const int codePointCount, const int probability) {
@@ -79,14 +81,45 @@ bool DynamicPatriciaTrieWritingHelper::addUnigramWord(


bool DynamicPatriciaTrieWritingHelper::addBigramWords(const int word0Pos, const int word1Pos,
bool DynamicPatriciaTrieWritingHelper::addBigramWords(const int word0Pos, const int word1Pos,
        const int probability) {
        const int probability) {
    int mMergedNodeCodePoints[MAX_WORD_LENGTH];
    DynamicPatriciaTrieNodeReader nodeReader(mBuffer, mBigramPolicy, mShortcutPolicy);
    DynamicPatriciaTrieNodeReader nodeReader(mBuffer, mBigramPolicy, mShortcutPolicy);
    nodeReader.fetchNodeInfoFromBuffer(word0Pos);
    nodeReader.fetchNodeInfoFromBufferAndGetNodeCodePoints(word0Pos, MAX_WORD_LENGTH,
    if (nodeReader.isDeleted()) {
            mMergedNodeCodePoints);
    // Move node to add bigram entry.
    const int newNodePos = mBuffer->getTailPosition();
    if (!markNodeAsMovedAndSetPosition(&nodeReader, newNodePos, newNodePos)) {
        return false;
        return false;
    }
    }
    // TODO: Implement.
    int writingPos = newNodePos;
    // Write a new PtNode using original PtNode's info to the tail of the dictionary.
    if (!writePtNodeToBufferByCopyingPtNodeInfo(&nodeReader, nodeReader.getParentPos(),
            mMergedNodeCodePoints, nodeReader.getCodePointCount(), nodeReader.getProbability(),
            &writingPos)) {
        return false;
    }
    nodeReader.fetchNodeInfoFromBuffer(newNodePos);
    if (nodeReader.getBigramsPos() != NOT_A_DICT_POS) {
        // Insert a new bigram entry into the existing bigram list.
        int bigramListPos = nodeReader.getBigramsPos();
        return mBigramPolicy->addNewBigramEntryToBigramList(word1Pos, probability, &bigramListPos);
    } else {
        // The PtNode doesn't have a bigram list.
        // First, Write a bigram entry at the tail position of the PtNode.
        if (!mBigramPolicy->writeNewBigramEntry(word1Pos, probability, &writingPos)) {
            return false;
            return false;
        }
        }
        // Then, Mark as the PtNode having bigram list in the flags.
        const PatriciaTrieReadingUtils::NodeFlags updatedFlags =
                PatriciaTrieReadingUtils::createAndGetFlags(nodeReader.isBlacklisted(),
                        nodeReader.isNotAWord(), nodeReader.getProbability() != NOT_A_PROBABILITY,
                        nodeReader.getShortcutPos() != NOT_A_DICT_POS, true /* hasBigrams */,
                        nodeReader.getCodePointCount() > 1, CHILDREN_POSITION_FIELD_SIZE);
        writingPos = newNodePos;
        // Write updated flags into the moved PtNode's flags field.
        return DynamicPatriciaTrieWritingUtils::writeFlagsAndAdvancePosition(mBuffer, updatedFlags,
                &writingPos);
    }
}


// Remove a bigram relation from word0Pos to word1Pos.
// Remove a bigram relation from word0Pos to word1Pos.
bool DynamicPatriciaTrieWritingHelper::removeBigramWords(const int word0Pos, const int word1Pos) {
bool DynamicPatriciaTrieWritingHelper::removeBigramWords(const int word0Pos, const int word1Pos) {
Loading