Loading native/jni/src/suggest/policyimpl/dictionary/bigram/bigram_list_read_write_utils.h +5 −0 Original line number Original line Diff line number Diff line Loading @@ -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, Loading native/jni/src/suggest/policyimpl/dictionary/bigram/dynamic_bigram_list_policy.cpp +39 −27 Original line number Original line Diff line number Diff line Loading @@ -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(); Loading @@ -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; } } Loading @@ -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; } } Loading native/jni/src/suggest/policyimpl/dictionary/bigram/dynamic_bigram_list_policy.h +4 −1 Original line number Original line Diff line number Diff line Loading @@ -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); Loading native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_node_reader.cpp +6 −4 Original line number Original line Diff line number Diff line Loading @@ -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(); } } Loading native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_writing_helper.cpp +37 −4 Original line number Original line Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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 Loading
native/jni/src/suggest/policyimpl/dictionary/bigram/bigram_list_read_write_utils.h +5 −0 Original line number Original line Diff line number Diff line Loading @@ -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, Loading
native/jni/src/suggest/policyimpl/dictionary/bigram/dynamic_bigram_list_policy.cpp +39 −27 Original line number Original line Diff line number Diff line Loading @@ -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(); Loading @@ -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; } } Loading @@ -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; } } Loading
native/jni/src/suggest/policyimpl/dictionary/bigram/dynamic_bigram_list_policy.h +4 −1 Original line number Original line Diff line number Diff line Loading @@ -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); Loading
native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_node_reader.cpp +6 −4 Original line number Original line Diff line number Diff line Loading @@ -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(); } } Loading
native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_writing_helper.cpp +37 −4 Original line number Original line Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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