12fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa/*
22fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * Copyright (C) 2013, The Android Open Source Project
32fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa *
42fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * Licensed under the Apache License, Version 2.0 (the "License");
52fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * you may not use this file except in compliance with the License.
62fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * You may obtain a copy of the License at
72fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa *
82fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa *     http://www.apache.org/licenses/LICENSE-2.0
92fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa *
102fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * Unless required by applicable law or agreed to in writing, software
112fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * distributed under the License is distributed on an "AS IS" BASIS,
122fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * See the License for the specific language governing permissions and
142fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * limitations under the License.
152fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa */
162fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
172fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#ifndef LATINIME_PT_NODE_WRITER_H
182fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#define LATINIME_PT_NODE_WRITER_H
192fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
208ca9be17db2f1845c7c7a3b584507cf60c9ca53dKen Wakasa#include <unordered_map>
212fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
228ca9be17db2f1845c7c7a3b584507cf60c9ca53dKen Wakasa#include "defines.h"
232fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#include "suggest/policyimpl/dictionary/structure/pt_common/pt_node_params.h"
249069d30043d5182dfd38465ad9bbc11ad73fab7cKeisuke Kuroyanagi#include "utils/int_array_view.h"
252fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
262fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasanamespace latinime {
272fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
28620a05ae59ec9f7be39557094fc306c51c712ca1Keisuke Kuroyanagiclass BigramProperty;
29b636e25e951e48e071d5348756413d6fc065632dKeisuke Kuroyanagiclass UnigramProperty;
30b636e25e951e48e071d5348756413d6fc065632dKeisuke Kuroyanagi
312fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa// Interface class used to write PtNode information.
322fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasaclass PtNodeWriter {
332fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa public:
348ca9be17db2f1845c7c7a3b584507cf60c9ca53dKen Wakasa    typedef std::unordered_map<int, int> PtNodeArrayPositionRelocationMap;
358ca9be17db2f1845c7c7a3b584507cf60c9ca53dKen Wakasa    typedef std::unordered_map<int, int> PtNodePositionRelocationMap;
362fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    struct DictPositionRelocationMap {
372fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa     public:
382fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        DictPositionRelocationMap()
392fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa                : mPtNodeArrayPositionRelocationMap(), mPtNodePositionRelocationMap() {}
402fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
412fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        PtNodeArrayPositionRelocationMap mPtNodeArrayPositionRelocationMap;
422fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        PtNodePositionRelocationMap mPtNodePositionRelocationMap;
432fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
442fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa     private:
452fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        DISALLOW_COPY_AND_ASSIGN(DictPositionRelocationMap);
462fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    };
472fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
482fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    virtual ~PtNodeWriter() {}
492fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
502fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    virtual bool markPtNodeAsDeleted(const PtNodeParams *const toBeUpdatedPtNodeParams) = 0;
512fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
522fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    virtual bool markPtNodeAsMoved(const PtNodeParams *const toBeUpdatedPtNodeParams,
532fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            const int movedPos, const int bigramLinkedNodePos) = 0;
542fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
552fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    virtual bool markPtNodeAsWillBecomeNonTerminal(
562fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            const PtNodeParams *const toBeUpdatedPtNodeParams) = 0;
572fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
58b636e25e951e48e071d5348756413d6fc065632dKeisuke Kuroyanagi    virtual bool updatePtNodeUnigramProperty(const PtNodeParams *const toBeUpdatedPtNodeParams,
59b636e25e951e48e071d5348756413d6fc065632dKeisuke Kuroyanagi            const UnigramProperty *const unigramProperty) = 0;
602fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
612fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    virtual bool updatePtNodeProbabilityAndGetNeedsToKeepPtNodeAfterGC(
622fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            const PtNodeParams *const toBeUpdatedPtNodeParams,
632fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            bool *const outNeedsToKeepPtNode) = 0;
642fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
652fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    virtual bool updateChildrenPosition(const PtNodeParams *const toBeUpdatedPtNodeParams,
662fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa                const int newChildrenPosition) = 0;
672fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
682fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    virtual bool writePtNodeAndAdvancePosition(const PtNodeParams *const ptNodeParams,
692fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            int *const ptNodeWritingPos) = 0;
702fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
712fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    virtual bool writeNewTerminalPtNodeAndAdvancePosition(const PtNodeParams *const ptNodeParams,
72b636e25e951e48e071d5348756413d6fc065632dKeisuke Kuroyanagi            const UnigramProperty *const unigramProperty, int *const ptNodeWritingPos) = 0;
732fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
749069d30043d5182dfd38465ad9bbc11ad73fab7cKeisuke Kuroyanagi    virtual bool addNgramEntry(const WordIdArrayView prevWordIds, const int wordId,
759069d30043d5182dfd38465ad9bbc11ad73fab7cKeisuke Kuroyanagi            const BigramProperty *const bigramProperty, bool *const outAddedNewEntry) = 0;
762fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
779069d30043d5182dfd38465ad9bbc11ad73fab7cKeisuke Kuroyanagi    virtual bool removeNgramEntry(const WordIdArrayView prevWordIds, const int wordId) = 0;
782fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
792fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    virtual bool updateAllBigramEntriesAndDeleteUselessEntries(
802fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            const PtNodeParams *const sourcePtNodeParams, int *const outBigramEntryCount) = 0;
812fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
822fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    virtual bool updateAllPositionFields(const PtNodeParams *const toBeUpdatedPtNodeParams,
832fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            const DictPositionRelocationMap *const dictPositionRelocationMap,
842fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            int *const outBigramEntryCount) = 0;
852fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
862fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    virtual bool addShortcutTarget(const PtNodeParams *const ptNodeParams,
872fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            const int *const targetCodePoints, const int targetCodePointCount,
882fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            const int shortcutProbability) = 0;
892fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
902fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa protected:
912fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    PtNodeWriter() {};
922fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
932fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa private:
942fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    DISALLOW_COPY_AND_ASSIGN(PtNodeWriter);
952fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa};
962fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa} // namespace latinime
972fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#endif /* LATINIME_PT_NODE_WRITER_H */
98