ver4_patricia_trie_node_writer.h revision 6bf268132d60061fd26bd8cba63a12b56b22056e
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
246bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi#ifndef LATINIME_BACKWARD_V401_VER4_PATRICIA_TRIE_NODE_WRITER_H
256bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi#define LATINIME_BACKWARD_V401_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"
316bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi#include "suggest/policyimpl/dictionary/structure/backward/v401/content/probability_entry.h"
326bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
336bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanaginamespace latinime {
346bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanaginamespace backward {
356bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanaginamespace v401 {
366bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
376bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi} // namespace v401
386bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi} // namespace backward
396bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagiclass BufferWithExtendableBuffer;
406bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanaginamespace backward {
416bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanaginamespace v401 {
426bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi} // namespace v401
436bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi} // namespace backward
446bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagiclass HeaderPolicy;
456bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanaginamespace backward {
466bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanaginamespace v401 {
476bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagiclass Ver4BigramListPolicy;
486bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagiclass Ver4DictBuffers;
496bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagiclass Ver4PatriciaTrieNodeReader;
506bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagiclass Ver4PtNodeArrayReader;
516bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagiclass Ver4ShortcutListPolicy;
526bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
536bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi/*
546bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * This class is used for helping to writes nodes of ver4 patricia trie.
556bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi */
566bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagiclass Ver4PatriciaTrieNodeWriter : public PtNodeWriter {
576bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi public:
586bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    Ver4PatriciaTrieNodeWriter(BufferWithExtendableBuffer *const trieBuffer,
596bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            Ver4DictBuffers *const buffers, const HeaderPolicy *const headerPolicy,
606bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const PtNodeReader *const ptNodeReader,
616bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const PtNodeArrayReader *const ptNodeArrayReader,
626bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            Ver4BigramListPolicy *const bigramPolicy, Ver4ShortcutListPolicy *const shortcutPolicy)
636bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            : mTrieBuffer(trieBuffer), mBuffers(buffers), mHeaderPolicy(headerPolicy),
646bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi              mReadingHelper(ptNodeReader, ptNodeArrayReader), mBigramPolicy(bigramPolicy),
656bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi              mShortcutPolicy(shortcutPolicy) {}
666bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
676bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual ~Ver4PatriciaTrieNodeWriter() {}
686bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
696bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool markPtNodeAsDeleted(const PtNodeParams *const toBeUpdatedPtNodeParams);
706bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
716bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool markPtNodeAsMoved(const PtNodeParams *const toBeUpdatedPtNodeParams,
726bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const int movedPos, const int bigramLinkedNodePos);
736bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
746bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool markPtNodeAsWillBecomeNonTerminal(
756bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const PtNodeParams *const toBeUpdatedPtNodeParams);
766bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
776bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool updatePtNodeUnigramProperty(const PtNodeParams *const toBeUpdatedPtNodeParams,
786bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const UnigramProperty *const unigramProperty);
796bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
806bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool updatePtNodeProbabilityAndGetNeedsToKeepPtNodeAfterGC(
816bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const PtNodeParams *const toBeUpdatedPtNodeParams, bool *const outNeedsToKeepPtNode);
826bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
836bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool updateChildrenPosition(const PtNodeParams *const toBeUpdatedPtNodeParams,
846bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const int newChildrenPosition);
856bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
866bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    bool updateTerminalId(const PtNodeParams *const toBeUpdatedPtNodeParams,
876bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const int newTerminalId);
886bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
896bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool writePtNodeAndAdvancePosition(const PtNodeParams *const ptNodeParams,
906bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            int *const ptNodeWritingPos);
916bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
926bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool writeNewTerminalPtNodeAndAdvancePosition(const PtNodeParams *const ptNodeParams,
936bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const UnigramProperty *const unigramProperty, int *const ptNodeWritingPos);
946bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
956bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool addNewBigramEntry(const PtNodeParams *const sourcePtNodeParams,
966bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const PtNodeParams *const targetPtNodeParam, const BigramProperty *const bigramProperty,
976bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            bool *const outAddedNewBigram);
986bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
996bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool removeBigramEntry(const PtNodeParams *const sourcePtNodeParams,
1006bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const PtNodeParams *const targetPtNodeParam);
1016bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1026bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool updateAllBigramEntriesAndDeleteUselessEntries(
1036bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const PtNodeParams *const sourcePtNodeParams, int *const outBigramEntryCount);
1046bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1056bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool updateAllPositionFields(const PtNodeParams *const toBeUpdatedPtNodeParams,
1066bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const DictPositionRelocationMap *const dictPositionRelocationMap,
1076bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            int *const outBigramEntryCount);
1086bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1096bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    virtual bool addShortcutTarget(const PtNodeParams *const ptNodeParams,
1106bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const int *const targetCodePoints, const int targetCodePointCount,
1116bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const int shortcutProbability);
1126bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1136bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    bool updatePtNodeHasBigramsAndShortcutTargetsFlags(const PtNodeParams *const ptNodeParams);
1146bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1156bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi private:
1166bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    DISALLOW_COPY_AND_ASSIGN(Ver4PatriciaTrieNodeWriter);
1176bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1186bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    bool writePtNodeAndGetTerminalIdAndAdvancePosition(
1196bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const PtNodeParams *const ptNodeParams, int *const outTerminalId,
1206bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            int *const ptNodeWritingPos);
1216bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1226bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    // Create updated probability entry using given unigram property. In addition to the
1236bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    // probability, this method updates historical information if needed.
1246bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    // TODO: Update flags belonging to the unigram property.
1256bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    const ProbabilityEntry createUpdatedEntryFrom(
1266bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const ProbabilityEntry *const originalProbabilityEntry,
1276bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const UnigramProperty *const unigramProperty) const;
1286bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1296bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    bool updatePtNodeFlags(const int ptNodePos, const bool isBlacklisted, const bool isNotAWord,
1306bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const bool isTerminal, const bool hasShortcutTargets, const bool hasBigrams,
1316bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi            const bool hasMultipleChars);
1326bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1336bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    static const int CHILDREN_POSITION_FIELD_SIZE;
1346bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi
1356bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    BufferWithExtendableBuffer *const mTrieBuffer;
1366bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    Ver4DictBuffers *const mBuffers;
1376bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    const HeaderPolicy *const mHeaderPolicy;
1386bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    DynamicPtReadingHelper mReadingHelper;
1396bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    Ver4BigramListPolicy *const mBigramPolicy;
1406bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi    Ver4ShortcutListPolicy *const mShortcutPolicy;
1416bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi};
1426bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi} // namespace v401
1436bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi} // namespace backward
1446bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi} // namespace latinime
1456bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi#endif /* LATINIME_BACKWARD_V401_VER4_PATRICIA_TRIE_NODE_WRITER_H */
146