Index: third_party/android_prediction/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_writer.cpp |
diff --git a/third_party/android_prediction/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_writer.cpp b/third_party/android_prediction/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_writer.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d7bae8befbc3c4d007c914efa9f8fe18290329c9 |
--- /dev/null |
+++ b/third_party/android_prediction/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_writer.cpp |
@@ -0,0 +1,430 @@ |
+/* |
+ * Copyright (C) 2013, The Android Open Source Project |
+ * |
+ * Licensed under the Apache License, Version 2.0 (the "License"); |
+ * you may not use this file except in compliance with the License. |
+ * You may obtain a copy of the License at |
+ * |
+ * http://www.apache.org/licenses/LICENSE-2.0 |
+ * |
+ * Unless required by applicable law or agreed to in writing, software |
+ * distributed under the License is distributed on an "AS IS" BASIS, |
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+ * See the License for the specific language governing permissions and |
+ * limitations under the License. |
+ */ |
+ |
+/* |
+ * !!!!! DO NOT EDIT THIS FILE !!!!! |
+ * |
+ * This file was generated from |
+ * suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.cpp |
+ */ |
+ |
+#include "third_party/android_prediction/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_writer.h" |
+ |
+#include "third_party/android_prediction/suggest/core/dictionary/property/unigram_property.h" |
+#include "third_party/android_prediction/suggest/policyimpl/dictionary/header/header_policy.h" |
+#include "third_party/android_prediction/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_reading_utils.h" |
+#include "third_party/android_prediction/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_writing_utils.h" |
+#include "third_party/android_prediction/suggest/policyimpl/dictionary/structure/pt_common/patricia_trie_reading_utils.h" |
+#include "third_party/android_prediction/suggest/policyimpl/dictionary/structure/backward/v402/bigram/ver4_bigram_list_policy.h" |
+#include "third_party/android_prediction/suggest/policyimpl/dictionary/structure/backward/v402/content/probability_entry.h" |
+#include "third_party/android_prediction/suggest/policyimpl/dictionary/structure/backward/v402/shortcut/ver4_shortcut_list_policy.h" |
+#include "third_party/android_prediction/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_reader.h" |
+#include "third_party/android_prediction/suggest/policyimpl/dictionary/structure/backward/v402/ver4_dict_buffers.h" |
+#include "third_party/android_prediction/suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h" |
+#include "third_party/android_prediction/suggest/policyimpl/dictionary/utils/forgetting_curve_utils.h" |
+ |
+namespace latinime { |
+namespace backward { |
+namespace v402 { |
+ |
+const int Ver4PatriciaTrieNodeWriter::CHILDREN_POSITION_FIELD_SIZE = 3; |
+ |
+bool Ver4PatriciaTrieNodeWriter::markPtNodeAsDeleted( |
+ const PtNodeParams *const toBeUpdatedPtNodeParams) { |
+ int pos = toBeUpdatedPtNodeParams->getHeadPos(); |
+ const bool usesAdditionalBuffer = mTrieBuffer->isInAdditionalBuffer(pos); |
+ const uint8_t *const dictBuf = mTrieBuffer->getBuffer(usesAdditionalBuffer); |
+ if (usesAdditionalBuffer) { |
+ pos -= mTrieBuffer->getOriginalBufferSize(); |
+ } |
+ // Read original flags |
+ const PatriciaTrieReadingUtils::NodeFlags originalFlags = |
+ PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(dictBuf, &pos); |
+ const PatriciaTrieReadingUtils::NodeFlags updatedFlags = |
+ DynamicPtReadingUtils::updateAndGetFlags(originalFlags, false /* isMoved */, |
+ true /* isDeleted */, false /* willBecomeNonTerminal */); |
+ int writingPos = toBeUpdatedPtNodeParams->getHeadPos(); |
+ // Update flags. |
+ if (!DynamicPtWritingUtils::writeFlagsAndAdvancePosition(mTrieBuffer, updatedFlags, |
+ &writingPos)) { |
+ return false; |
+ } |
+ if (toBeUpdatedPtNodeParams->isTerminal()) { |
+ // The PtNode is a terminal. Delete entry from the terminal position lookup table. |
+ return mBuffers->getMutableTerminalPositionLookupTable()->setTerminalPtNodePosition( |
+ toBeUpdatedPtNodeParams->getTerminalId(), NOT_A_DICT_POS /* ptNodePos */); |
+ } else { |
+ return true; |
+ } |
+} |
+ |
+bool Ver4PatriciaTrieNodeWriter::markPtNodeAsMoved( |
+ const PtNodeParams *const toBeUpdatedPtNodeParams, |
+ const int movedPos, const int bigramLinkedNodePos) { |
+ int pos = toBeUpdatedPtNodeParams->getHeadPos(); |
+ const bool usesAdditionalBuffer = mTrieBuffer->isInAdditionalBuffer(pos); |
+ const uint8_t *const dictBuf = mTrieBuffer->getBuffer(usesAdditionalBuffer); |
+ if (usesAdditionalBuffer) { |
+ pos -= mTrieBuffer->getOriginalBufferSize(); |
+ } |
+ // Read original flags |
+ const PatriciaTrieReadingUtils::NodeFlags originalFlags = |
+ PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(dictBuf, &pos); |
+ const PatriciaTrieReadingUtils::NodeFlags updatedFlags = |
+ DynamicPtReadingUtils::updateAndGetFlags(originalFlags, true /* isMoved */, |
+ false /* isDeleted */, false /* willBecomeNonTerminal */); |
+ int writingPos = toBeUpdatedPtNodeParams->getHeadPos(); |
+ // Update flags. |
+ if (!DynamicPtWritingUtils::writeFlagsAndAdvancePosition(mTrieBuffer, updatedFlags, |
+ &writingPos)) { |
+ return false; |
+ } |
+ // Update moved position, which is stored in the parent offset field. |
+ if (!DynamicPtWritingUtils::writeParentPosOffsetAndAdvancePosition( |
+ mTrieBuffer, movedPos, toBeUpdatedPtNodeParams->getHeadPos(), &writingPos)) { |
+ return false; |
+ } |
+ if (toBeUpdatedPtNodeParams->hasChildren()) { |
+ // Update children's parent position. |
+ mReadingHelper.initWithPtNodeArrayPos(toBeUpdatedPtNodeParams->getChildrenPos()); |
+ while (!mReadingHelper.isEnd()) { |
+ const PtNodeParams childPtNodeParams(mReadingHelper.getPtNodeParams()); |
+ int parentOffsetFieldPos = childPtNodeParams.getHeadPos() |
+ + DynamicPtWritingUtils::NODE_FLAG_FIELD_SIZE; |
+ if (!DynamicPtWritingUtils::writeParentPosOffsetAndAdvancePosition( |
+ mTrieBuffer, bigramLinkedNodePos, childPtNodeParams.getHeadPos(), |
+ &parentOffsetFieldPos)) { |
+ // Parent offset cannot be written because of a bug or a broken dictionary; thus, |
+ // we give up to update dictionary. |
+ return false; |
+ } |
+ mReadingHelper.readNextSiblingNode(childPtNodeParams); |
+ } |
+ } |
+ return true; |
+} |
+ |
+bool Ver4PatriciaTrieNodeWriter::markPtNodeAsWillBecomeNonTerminal( |
+ const PtNodeParams *const toBeUpdatedPtNodeParams) { |
+ int pos = toBeUpdatedPtNodeParams->getHeadPos(); |
+ const bool usesAdditionalBuffer = mTrieBuffer->isInAdditionalBuffer(pos); |
+ const uint8_t *const dictBuf = mTrieBuffer->getBuffer(usesAdditionalBuffer); |
+ if (usesAdditionalBuffer) { |
+ pos -= mTrieBuffer->getOriginalBufferSize(); |
+ } |
+ // Read original flags |
+ const PatriciaTrieReadingUtils::NodeFlags originalFlags = |
+ PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(dictBuf, &pos); |
+ const PatriciaTrieReadingUtils::NodeFlags updatedFlags = |
+ DynamicPtReadingUtils::updateAndGetFlags(originalFlags, false /* isMoved */, |
+ false /* isDeleted */, true /* willBecomeNonTerminal */); |
+ if (!mBuffers->getMutableTerminalPositionLookupTable()->setTerminalPtNodePosition( |
+ toBeUpdatedPtNodeParams->getTerminalId(), NOT_A_DICT_POS /* ptNodePos */)) { |
+ AKLOGE("Cannot update terminal position lookup table. terminal id: %d", |
+ toBeUpdatedPtNodeParams->getTerminalId()); |
+ return false; |
+ } |
+ // Update flags. |
+ int writingPos = toBeUpdatedPtNodeParams->getHeadPos(); |
+ return DynamicPtWritingUtils::writeFlagsAndAdvancePosition(mTrieBuffer, updatedFlags, |
+ &writingPos); |
+} |
+ |
+bool Ver4PatriciaTrieNodeWriter::updatePtNodeUnigramProperty( |
+ const PtNodeParams *const toBeUpdatedPtNodeParams, |
+ const UnigramProperty *const unigramProperty) { |
+ // Update probability and historical information. |
+ // TODO: Update other information in the unigram property. |
+ if (!toBeUpdatedPtNodeParams->isTerminal()) { |
+ return false; |
+ } |
+ const ProbabilityEntry originalProbabilityEntry = |
+ mBuffers->getProbabilityDictContent()->getProbabilityEntry( |
+ toBeUpdatedPtNodeParams->getTerminalId()); |
+ const ProbabilityEntry probabilityEntry = createUpdatedEntryFrom(&originalProbabilityEntry, |
+ unigramProperty); |
+ return mBuffers->getMutableProbabilityDictContent()->setProbabilityEntry( |
+ toBeUpdatedPtNodeParams->getTerminalId(), &probabilityEntry); |
+} |
+ |
+bool Ver4PatriciaTrieNodeWriter::updatePtNodeProbabilityAndGetNeedsToKeepPtNodeAfterGC( |
+ const PtNodeParams *const toBeUpdatedPtNodeParams, bool *const outNeedsToKeepPtNode) { |
+ if (!toBeUpdatedPtNodeParams->isTerminal()) { |
+ AKLOGE("updatePtNodeProbabilityAndGetNeedsToSaveForGC is called for non-terminal PtNode."); |
+ return false; |
+ } |
+ const ProbabilityEntry originalProbabilityEntry = |
+ mBuffers->getProbabilityDictContent()->getProbabilityEntry( |
+ toBeUpdatedPtNodeParams->getTerminalId()); |
+ if (originalProbabilityEntry.hasHistoricalInfo()) { |
+ const HistoricalInfo historicalInfo = ForgettingCurveUtils::createHistoricalInfoToSave( |
+ originalProbabilityEntry.getHistoricalInfo(), mHeaderPolicy); |
+ const ProbabilityEntry probabilityEntry = |
+ originalProbabilityEntry.createEntryWithUpdatedHistoricalInfo(&historicalInfo); |
+ if (!mBuffers->getMutableProbabilityDictContent()->setProbabilityEntry( |
+ toBeUpdatedPtNodeParams->getTerminalId(), &probabilityEntry)) { |
+ AKLOGE("Cannot write updated probability entry. terminalId: %d", |
+ toBeUpdatedPtNodeParams->getTerminalId()); |
+ return false; |
+ } |
+ const bool isValid = ForgettingCurveUtils::needsToKeep(&historicalInfo, mHeaderPolicy); |
+ if (!isValid) { |
+ if (!markPtNodeAsWillBecomeNonTerminal(toBeUpdatedPtNodeParams)) { |
+ AKLOGE("Cannot mark PtNode as willBecomeNonTerminal."); |
+ return false; |
+ } |
+ } |
+ *outNeedsToKeepPtNode = isValid; |
+ } else { |
+ // No need to update probability. |
+ *outNeedsToKeepPtNode = true; |
+ } |
+ return true; |
+} |
+ |
+bool Ver4PatriciaTrieNodeWriter::updateChildrenPosition( |
+ const PtNodeParams *const toBeUpdatedPtNodeParams, const int newChildrenPosition) { |
+ int childrenPosFieldPos = toBeUpdatedPtNodeParams->getChildrenPosFieldPos(); |
+ return DynamicPtWritingUtils::writeChildrenPositionAndAdvancePosition(mTrieBuffer, |
+ newChildrenPosition, &childrenPosFieldPos); |
+} |
+ |
+bool Ver4PatriciaTrieNodeWriter::updateTerminalId(const PtNodeParams *const toBeUpdatedPtNodeParams, |
+ const int newTerminalId) { |
+ return mTrieBuffer->writeUint(newTerminalId, Ver4DictConstants::TERMINAL_ID_FIELD_SIZE, |
+ toBeUpdatedPtNodeParams->getTerminalIdFieldPos()); |
+} |
+ |
+bool Ver4PatriciaTrieNodeWriter::writePtNodeAndAdvancePosition( |
+ const PtNodeParams *const ptNodeParams, int *const ptNodeWritingPos) { |
+ return writePtNodeAndGetTerminalIdAndAdvancePosition(ptNodeParams, 0 /* outTerminalId */, |
+ ptNodeWritingPos); |
+} |
+ |
+ |
+bool Ver4PatriciaTrieNodeWriter::writeNewTerminalPtNodeAndAdvancePosition( |
+ const PtNodeParams *const ptNodeParams, const UnigramProperty *const unigramProperty, |
+ int *const ptNodeWritingPos) { |
+ int terminalId = Ver4DictConstants::NOT_A_TERMINAL_ID; |
+ if (!writePtNodeAndGetTerminalIdAndAdvancePosition(ptNodeParams, &terminalId, |
+ ptNodeWritingPos)) { |
+ return false; |
+ } |
+ // Write probability. |
+ ProbabilityEntry newProbabilityEntry; |
+ const ProbabilityEntry probabilityEntryToWrite = createUpdatedEntryFrom( |
+ &newProbabilityEntry, unigramProperty); |
+ return mBuffers->getMutableProbabilityDictContent()->setProbabilityEntry(terminalId, |
+ &probabilityEntryToWrite); |
+} |
+ |
+bool Ver4PatriciaTrieNodeWriter::addNgramEntry(const WordIdArrayView prevWordIds, const int wordId, |
+ const BigramProperty *const bigramProperty, bool *const outAddedNewEntry) { |
+ if (!mBigramPolicy->addNewEntry(prevWordIds[0], wordId, bigramProperty, outAddedNewEntry)) { |
+ AKLOGE("Cannot add new bigram entry. terminalId: %d, targetTerminalId: %d", |
+ sourcePtNodeParams->getTerminalId(), targetPtNodeParam->getTerminalId()); |
+ return false; |
+ } |
+ const int ptNodePos = |
+ mBuffers->getTerminalPositionLookupTable()->getTerminalPtNodePosition(prevWordIds[0]); |
+ const PtNodeParams sourcePtNodeParams = |
+ mPtNodeReader->fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos); |
+ if (!sourcePtNodeParams.hasBigrams()) { |
+ // Update has bigrams flag. |
+ return updatePtNodeFlags(sourcePtNodeParams.getHeadPos(), |
+ sourcePtNodeParams.isBlacklisted(), sourcePtNodeParams.isNotAWord(), |
+ sourcePtNodeParams.isTerminal(), sourcePtNodeParams.hasShortcutTargets(), |
+ true /* hasBigrams */, |
+ sourcePtNodeParams.getCodePointCount() > 1 /* hasMultipleChars */); |
+ } |
+ return true; |
+} |
+ |
+bool Ver4PatriciaTrieNodeWriter::removeNgramEntry(const WordIdArrayView prevWordIds, |
+ const int wordId) { |
+ return mBigramPolicy->removeEntry(prevWordIds[0], wordId); |
+} |
+ |
+bool Ver4PatriciaTrieNodeWriter::updateAllBigramEntriesAndDeleteUselessEntries( |
+ const PtNodeParams *const sourcePtNodeParams, int *const outBigramEntryCount) { |
+ return mBigramPolicy->updateAllBigramEntriesAndDeleteUselessEntries( |
+ sourcePtNodeParams->getTerminalId(), outBigramEntryCount); |
+} |
+ |
+bool Ver4PatriciaTrieNodeWriter::updateAllPositionFields( |
+ const PtNodeParams *const toBeUpdatedPtNodeParams, |
+ const DictPositionRelocationMap *const dictPositionRelocationMap, |
+ int *const outBigramEntryCount) { |
+ int parentPos = toBeUpdatedPtNodeParams->getParentPos(); |
+ if (parentPos != NOT_A_DICT_POS) { |
+ PtNodeWriter::PtNodePositionRelocationMap::const_iterator it = |
+ dictPositionRelocationMap->mPtNodePositionRelocationMap.find(parentPos); |
+ if (it != dictPositionRelocationMap->mPtNodePositionRelocationMap.end()) { |
+ parentPos = it->second; |
+ } |
+ } |
+ int writingPos = toBeUpdatedPtNodeParams->getHeadPos() |
+ + DynamicPtWritingUtils::NODE_FLAG_FIELD_SIZE; |
+ // Write updated parent offset. |
+ if (!DynamicPtWritingUtils::writeParentPosOffsetAndAdvancePosition(mTrieBuffer, |
+ parentPos, toBeUpdatedPtNodeParams->getHeadPos(), &writingPos)) { |
+ return false; |
+ } |
+ |
+ // Updates children position. |
+ int childrenPos = toBeUpdatedPtNodeParams->getChildrenPos(); |
+ if (childrenPos != NOT_A_DICT_POS) { |
+ PtNodeWriter::PtNodeArrayPositionRelocationMap::const_iterator it = |
+ dictPositionRelocationMap->mPtNodeArrayPositionRelocationMap.find(childrenPos); |
+ if (it != dictPositionRelocationMap->mPtNodeArrayPositionRelocationMap.end()) { |
+ childrenPos = it->second; |
+ } |
+ } |
+ if (!updateChildrenPosition(toBeUpdatedPtNodeParams, childrenPos)) { |
+ return false; |
+ } |
+ |
+ // Counts bigram entries. |
+ if (outBigramEntryCount) { |
+ *outBigramEntryCount = mBigramPolicy->getBigramEntryConut( |
+ toBeUpdatedPtNodeParams->getTerminalId()); |
+ } |
+ return true; |
+} |
+ |
+bool Ver4PatriciaTrieNodeWriter::addShortcutTarget(const PtNodeParams *const ptNodeParams, |
+ const int *const targetCodePoints, const int targetCodePointCount, |
+ const int shortcutProbability) { |
+ if (!mShortcutPolicy->addNewShortcut(ptNodeParams->getTerminalId(), |
+ targetCodePoints, targetCodePointCount, shortcutProbability)) { |
+ AKLOGE("Cannot add new shortuct entry. terminalId: %d", ptNodeParams->getTerminalId()); |
+ return false; |
+ } |
+ if (!ptNodeParams->hasShortcutTargets()) { |
+ // Update has shortcut targets flag. |
+ return updatePtNodeFlags(ptNodeParams->getHeadPos(), |
+ ptNodeParams->isBlacklisted(), ptNodeParams->isNotAWord(), |
+ ptNodeParams->isTerminal(), true /* hasShortcutTargets */, |
+ ptNodeParams->hasBigrams(), |
+ ptNodeParams->getCodePointCount() > 1 /* hasMultipleChars */); |
+ } |
+ return true; |
+} |
+ |
+bool Ver4PatriciaTrieNodeWriter::updatePtNodeHasBigramsAndShortcutTargetsFlags( |
+ const PtNodeParams *const ptNodeParams) { |
+ const bool hasBigrams = mBuffers->getBigramDictContent()->getBigramListHeadPos( |
+ ptNodeParams->getTerminalId()) != NOT_A_DICT_POS; |
+ const bool hasShortcutTargets = mBuffers->getShortcutDictContent()->getShortcutListHeadPos( |
+ ptNodeParams->getTerminalId()) != NOT_A_DICT_POS; |
+ return updatePtNodeFlags(ptNodeParams->getHeadPos(), ptNodeParams->isBlacklisted(), |
+ ptNodeParams->isNotAWord(), ptNodeParams->isTerminal(), hasShortcutTargets, |
+ hasBigrams, ptNodeParams->getCodePointCount() > 1 /* hasMultipleChars */); |
+} |
+ |
+bool Ver4PatriciaTrieNodeWriter::writePtNodeAndGetTerminalIdAndAdvancePosition( |
+ const PtNodeParams *const ptNodeParams, int *const outTerminalId, |
+ int *const ptNodeWritingPos) { |
+ const int nodePos = *ptNodeWritingPos; |
+ // Write dummy flags. The Node flags are updated with appropriate flags at the last step of the |
+ // PtNode writing. |
+ if (!DynamicPtWritingUtils::writeFlagsAndAdvancePosition(mTrieBuffer, |
+ 0 /* nodeFlags */, ptNodeWritingPos)) { |
+ return false; |
+ } |
+ // Calculate a parent offset and write the offset. |
+ if (!DynamicPtWritingUtils::writeParentPosOffsetAndAdvancePosition(mTrieBuffer, |
+ ptNodeParams->getParentPos(), nodePos, ptNodeWritingPos)) { |
+ return false; |
+ } |
+ // Write code points |
+ if (!DynamicPtWritingUtils::writeCodePointsAndAdvancePosition(mTrieBuffer, |
+ ptNodeParams->getCodePoints(), ptNodeParams->getCodePointCount(), ptNodeWritingPos)) { |
+ return false; |
+ } |
+ int terminalId = Ver4DictConstants::NOT_A_TERMINAL_ID; |
+ if (!ptNodeParams->willBecomeNonTerminal()) { |
+ if (ptNodeParams->getTerminalId() != Ver4DictConstants::NOT_A_TERMINAL_ID) { |
+ terminalId = ptNodeParams->getTerminalId(); |
+ } else if (ptNodeParams->isTerminal()) { |
+ // Write terminal information using a new terminal id. |
+ // Get a new unused terminal id. |
+ terminalId = mBuffers->getTerminalPositionLookupTable()->getNextTerminalId(); |
+ } |
+ } |
+ const int isTerminal = terminalId != Ver4DictConstants::NOT_A_TERMINAL_ID; |
+ if (isTerminal) { |
+ // Update the lookup table. |
+ if (!mBuffers->getMutableTerminalPositionLookupTable()->setTerminalPtNodePosition( |
+ terminalId, nodePos)) { |
+ return false; |
+ } |
+ // Write terminal Id. |
+ if (!mTrieBuffer->writeUintAndAdvancePosition(terminalId, |
+ Ver4DictConstants::TERMINAL_ID_FIELD_SIZE, ptNodeWritingPos)) { |
+ return false; |
+ } |
+ if (outTerminalId) { |
+ *outTerminalId = terminalId; |
+ } |
+ } |
+ // Write children position |
+ if (!DynamicPtWritingUtils::writeChildrenPositionAndAdvancePosition(mTrieBuffer, |
+ ptNodeParams->getChildrenPos(), ptNodeWritingPos)) { |
+ return false; |
+ } |
+ return updatePtNodeFlags(nodePos, ptNodeParams->isBlacklisted(), ptNodeParams->isNotAWord(), |
+ isTerminal, ptNodeParams->hasShortcutTargets(), ptNodeParams->hasBigrams(), |
+ ptNodeParams->getCodePointCount() > 1 /* hasMultipleChars */); |
+} |
+ |
+const ProbabilityEntry Ver4PatriciaTrieNodeWriter::createUpdatedEntryFrom( |
+ const ProbabilityEntry *const originalProbabilityEntry, |
+ const UnigramProperty *const unigramProperty) const { |
+ // TODO: Consolidate historical info and probability. |
+ if (mHeaderPolicy->hasHistoricalInfoOfWords()) { |
+ const HistoricalInfo historicalInfoForUpdate(unigramProperty->getTimestamp(), |
+ unigramProperty->getLevel(), unigramProperty->getCount()); |
+ const HistoricalInfo updatedHistoricalInfo = |
+ ForgettingCurveUtils::createUpdatedHistoricalInfo( |
+ originalProbabilityEntry->getHistoricalInfo(), |
+ unigramProperty->getProbability(), &historicalInfoForUpdate, mHeaderPolicy); |
+ return originalProbabilityEntry->createEntryWithUpdatedHistoricalInfo( |
+ &updatedHistoricalInfo); |
+ } else { |
+ return originalProbabilityEntry->createEntryWithUpdatedProbability( |
+ unigramProperty->getProbability()); |
+ } |
+} |
+ |
+bool Ver4PatriciaTrieNodeWriter::updatePtNodeFlags(const int ptNodePos, |
+ const bool isBlacklisted, const bool isNotAWord, const bool isTerminal, |
+ const bool hasShortcutTargets, const bool hasBigrams, const bool hasMultipleChars) { |
+ // Create node flags and write them. |
+ PatriciaTrieReadingUtils::NodeFlags nodeFlags = |
+ PatriciaTrieReadingUtils::createAndGetFlags(isBlacklisted, isNotAWord, isTerminal, |
+ hasShortcutTargets, hasBigrams, hasMultipleChars, |
+ CHILDREN_POSITION_FIELD_SIZE); |
+ if (!DynamicPtWritingUtils::writeFlags(mTrieBuffer, nodeFlags, ptNodePos)) { |
+ AKLOGE("Cannot write PtNode flags. flags: %x, pos: %d", nodeFlags, ptNodePos); |
+ return false; |
+ } |
+ return true; |
+} |
+ |
+} // namespace v402 |
+} // namespace backward |
+} // namespace latinime |