16bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi/*
26bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * Copyright (C) 2013, The Android Open Source Project
36bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi *
46bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License");
56bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * you may not use this file except in compliance with the License.
66bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * You may obtain a copy of the License at
76bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi *
86bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi *     http://www.apache.org/licenses/LICENSE-2.0
96bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi *
106bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software
116bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS,
126bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * See the License for the specific language governing permissions and
146bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * limitations under the License.
156bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi */
166bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
176bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi/*
186bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * !!!!! DO NOT EDIT THIS FILE !!!!!
196bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi *
206bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * This file was generated from
216bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi *   suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.h
226bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi */
236bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
2407e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi#ifndef LATINIME_BACKWARD_V402_VER4_PATRICIA_TRIE_NODE_WRITER_H
2507e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi#define LATINIME_BACKWARD_V402_VER4_PATRICIA_TRIE_NODE_WRITER_H
266bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
276bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi#include "defines.h"
286bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi#include "suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_reading_helper.h"
296bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi#include "suggest/policyimpl/dictionary/structure/pt_common/pt_node_params.h"
306bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi#include "suggest/policyimpl/dictionary/structure/pt_common/pt_node_writer.h"
3107e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi#include "suggest/policyimpl/dictionary/structure/backward/v402/content/probability_entry.h"
329069d30043d5182dfd38465ad9bbc11ad73fab7cKeisuke Kuroyanagi#include "utils/int_array_view.h"
336bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
346bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanaginamespace latinime {
356bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanaginamespace backward {
3607e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanaginamespace v402 {
376bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
3807e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi} // namespace v402
396bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi} // namespace backward
406bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagiclass BufferWithExtendableBuffer;
416bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanaginamespace backward {
4207e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanaginamespace v402 {
4307e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi} // namespace v402
446bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi} // namespace backward
456bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagiclass HeaderPolicy;
466bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanaginamespace backward {
4707e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanaginamespace v402 {
486bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagiclass Ver4BigramListPolicy;
496bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagiclass Ver4DictBuffers;
506bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagiclass Ver4PatriciaTrieNodeReader;
516bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagiclass Ver4PtNodeArrayReader;
526bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagiclass Ver4ShortcutListPolicy;
536bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
546bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi/*
556bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * This class is used for helping to writes nodes of ver4 patricia trie.
566bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi */
576bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagiclass Ver4PatriciaTrieNodeWriter : public PtNodeWriter {
586bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi public:
596bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    Ver4PatriciaTrieNodeWriter(BufferWithExtendableBuffer *const trieBuffer,
606bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            Ver4DictBuffers *const buffers, const HeaderPolicy *const headerPolicy,
616bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const PtNodeReader *const ptNodeReader,
626bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const PtNodeArrayReader *const ptNodeArrayReader,
636bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            Ver4BigramListPolicy *const bigramPolicy, Ver4ShortcutListPolicy *const shortcutPolicy)
646bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            : mTrieBuffer(trieBuffer), mBuffers(buffers), mHeaderPolicy(headerPolicy),
659069d30043d5182dfd38465ad9bbc11ad73fab7cKeisuke Kuroyanagi              mPtNodeReader(ptNodeReader), mReadingHelper(ptNodeReader, ptNodeArrayReader),
669069d30043d5182dfd38465ad9bbc11ad73fab7cKeisuke Kuroyanagi              mBigramPolicy(bigramPolicy), mShortcutPolicy(shortcutPolicy) {}
676bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
686bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual ~Ver4PatriciaTrieNodeWriter() {}
696bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
706bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool markPtNodeAsDeleted(const PtNodeParams *const toBeUpdatedPtNodeParams);
716bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
726bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool markPtNodeAsMoved(const PtNodeParams *const toBeUpdatedPtNodeParams,
736bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const int movedPos, const int bigramLinkedNodePos);
746bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
756bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool markPtNodeAsWillBecomeNonTerminal(
766bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const PtNodeParams *const toBeUpdatedPtNodeParams);
776bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
786bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool updatePtNodeUnigramProperty(const PtNodeParams *const toBeUpdatedPtNodeParams,
796bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const UnigramProperty *const unigramProperty);
806bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
816bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool updatePtNodeProbabilityAndGetNeedsToKeepPtNodeAfterGC(
826bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const PtNodeParams *const toBeUpdatedPtNodeParams, bool *const outNeedsToKeepPtNode);
836bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
846bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool updateChildrenPosition(const PtNodeParams *const toBeUpdatedPtNodeParams,
856bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const int newChildrenPosition);
866bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
876bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    bool updateTerminalId(const PtNodeParams *const toBeUpdatedPtNodeParams,
886bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const int newTerminalId);
896bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
906bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool writePtNodeAndAdvancePosition(const PtNodeParams *const ptNodeParams,
916bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            int *const ptNodeWritingPos);
926bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
936bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool writeNewTerminalPtNodeAndAdvancePosition(const PtNodeParams *const ptNodeParams,
946bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const UnigramProperty *const unigramProperty, int *const ptNodeWritingPos);
956bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
969069d30043d5182dfd38465ad9bbc11ad73fab7cKeisuke Kuroyanagi    virtual bool addNgramEntry(const WordIdArrayView prevWordIds, const int wordId,
979069d30043d5182dfd38465ad9bbc11ad73fab7cKeisuke Kuroyanagi            const BigramProperty *const bigramProperty, bool *const outAddedNewEntry);
986bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
999069d30043d5182dfd38465ad9bbc11ad73fab7cKeisuke Kuroyanagi    virtual bool removeNgramEntry(const WordIdArrayView prevWordIds, const int wordId);
1006bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1016bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool updateAllBigramEntriesAndDeleteUselessEntries(
1026bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const PtNodeParams *const sourcePtNodeParams, int *const outBigramEntryCount);
1036bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1046bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool updateAllPositionFields(const PtNodeParams *const toBeUpdatedPtNodeParams,
1056bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const DictPositionRelocationMap *const dictPositionRelocationMap,
1066bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            int *const outBigramEntryCount);
1076bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1086bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool addShortcutTarget(const PtNodeParams *const ptNodeParams,
1096bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const int *const targetCodePoints, const int targetCodePointCount,
1106bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const int shortcutProbability);
1116bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1126bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    bool updatePtNodeHasBigramsAndShortcutTargetsFlags(const PtNodeParams *const ptNodeParams);
1136bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1146bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi private:
1156bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    DISALLOW_COPY_AND_ASSIGN(Ver4PatriciaTrieNodeWriter);
1166bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1176bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    bool writePtNodeAndGetTerminalIdAndAdvancePosition(
1186bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const PtNodeParams *const ptNodeParams, int *const outTerminalId,
1196bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            int *const ptNodeWritingPos);
1206bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1216bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    // Create updated probability entry using given unigram property. In addition to the
1226bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    // probability, this method updates historical information if needed.
1236bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    // TODO: Update flags belonging to the unigram property.
1246bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    const ProbabilityEntry createUpdatedEntryFrom(
1256bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const ProbabilityEntry *const originalProbabilityEntry,
1266bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const UnigramProperty *const unigramProperty) const;
1276bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1286bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    bool updatePtNodeFlags(const int ptNodePos, const bool isBlacklisted, const bool isNotAWord,
1296bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const bool isTerminal, const bool hasShortcutTargets, const bool hasBigrams,
1306bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const bool hasMultipleChars);
1316bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1326bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    static const int CHILDREN_POSITION_FIELD_SIZE;
1336bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1346bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    BufferWithExtendableBuffer *const mTrieBuffer;
1356bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    Ver4DictBuffers *const mBuffers;
1366bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    const HeaderPolicy *const mHeaderPolicy;
1379069d30043d5182dfd38465ad9bbc11ad73fab7cKeisuke Kuroyanagi    const PtNodeReader *const mPtNodeReader;
1386bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    DynamicPtReadingHelper mReadingHelper;
1396bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    Ver4BigramListPolicy *const mBigramPolicy;
1406bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    Ver4ShortcutListPolicy *const mShortcutPolicy;
1416bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi};
14207e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi} // namespace v402
1436bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi} // namespace backward
1446bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi} // namespace latinime
14507e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi#endif /* LATINIME_BACKWARD_V402_VER4_PATRICIA_TRIE_NODE_WRITER_H */
146