Index: third_party/prediction/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_writer.cpp |
diff --git a/third_party/prediction/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_writer.cpp b/third_party/prediction/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_writer.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..39883d115bb8593a146425e62fdf196c165c975a |
--- /dev/null |
+++ b/third_party/prediction/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_writer.cpp |
@@ -0,0 +1,486 @@ |
+/* |
+ * 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 |
+ * third_party/prediction/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.cpp |
+ */ |
+ |
+#include "third_party/prediction/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_writer.h" |
+ |
+#include "third_party/prediction/suggest/core/dictionary/property/unigram_property.h" |
+#include "third_party/prediction/suggest/policyimpl/dictionary/header/header_policy.h" |
+#include "third_party/prediction/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_reading_utils.h" |
+#include "third_party/prediction/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_writing_utils.h" |
+#include "third_party/prediction/suggest/policyimpl/dictionary/structure/pt_common/patricia_trie_reading_utils.h" |
+#include "third_party/prediction/suggest/policyimpl/dictionary/structure/backward/v402/bigram/ver4_bigram_list_policy.h" |
+#include "third_party/prediction/suggest/policyimpl/dictionary/structure/backward/v402/content/probability_entry.h" |
+#include "third_party/prediction/suggest/policyimpl/dictionary/structure/backward/v402/shortcut/ver4_shortcut_list_policy.h" |
+#include "third_party/prediction/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_reader.h" |
+#include "third_party/prediction/suggest/policyimpl/dictionary/structure/backward/v402/ver4_dict_buffers.h" |
+#include "third_party/prediction/suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h" |
+#include "third_party/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 |