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

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

Implement addBigramWords() for DynamicPatriciaTrie.

Bug: 6669677
Change-Id: Ia6aa76c212165690191c65fee9dacdc44be5acd5
parent 8faa1a44
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