1fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi/*
2fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi * Copyright (C) 2013, The Android Open Source Project
3fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi *
4fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License");
5fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi * you may not use this file except in compliance with the License.
6fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi * You may obtain a copy of the License at
7fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi *
8fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi *     http://www.apache.org/licenses/LICENSE-2.0
9fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi *
10fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software
11fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS,
12fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi * See the License for the specific language governing permissions and
14fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi * limitations under the License.
15fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi */
16fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi
1713d5dc914aae5cb6bf6ef06aa05643514a40318cKeisuke Kuroyanagi#ifndef LATINIME_FORGETTING_CURVE_UTILS_H
1813d5dc914aae5cb6bf6ef06aa05643514a40318cKeisuke Kuroyanagi#define LATINIME_FORGETTING_CURVE_UTILS_H
19fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi
207c4dcf1e918c2b9251e7aa907d991a3ab8764bafKeisuke Kuroyanagi#include <vector>
217c4dcf1e918c2b9251e7aa907d991a3ab8764bafKeisuke Kuroyanagi
22fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi#include "defines.h"
232fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#include "suggest/policyimpl/dictionary/utils/historical_info.h"
24fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi
25fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanaginamespace latinime {
26fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi
2757816c7a8bac1a47913da7a503ece2b5dd7cc0fcKeisuke Kuroyanagiclass HeaderPolicy;
2867c855ea6f882190d73df9d3fae0b56929fd6888Keisuke Kuroyanagi
2913d5dc914aae5cb6bf6ef06aa05643514a40318cKeisuke Kuroyanagiclass ForgettingCurveUtils {
30fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi public:
312fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    static const HistoricalInfo createUpdatedHistoricalInfo(
322fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            const HistoricalInfo *const originalHistoricalInfo, const int newProbability,
339d7e8c717f56a8b706a174fd3d5a2864d08d320cKeisuke Kuroyanagi            const HistoricalInfo *const newHistoricalInfo, const HeaderPolicy *const headerPolicy);
3467c855ea6f882190d73df9d3fae0b56929fd6888Keisuke Kuroyanagi
352fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    static const HistoricalInfo createHistoricalInfoToSave(
3657816c7a8bac1a47913da7a503ece2b5dd7cc0fcKeisuke Kuroyanagi            const HistoricalInfo *const originalHistoricalInfo,
3757816c7a8bac1a47913da7a503ece2b5dd7cc0fcKeisuke Kuroyanagi            const HeaderPolicy *const headerPolicy);
38fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi
3957816c7a8bac1a47913da7a503ece2b5dd7cc0fcKeisuke Kuroyanagi    static int decodeProbability(const HistoricalInfo *const historicalInfo,
4057816c7a8bac1a47913da7a503ece2b5dd7cc0fcKeisuke Kuroyanagi            const HeaderPolicy *const headerPolicy);
41fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi
422fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    static int getProbability(const int encodedUnigramProbability,
432fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            const int encodedBigramProbability);
44fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi
455128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi    static bool needsToKeep(const HistoricalInfo *const historicalInfo,
465128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi            const HeaderPolicy *const headerPolicy);
4767c855ea6f882190d73df9d3fae0b56929fd6888Keisuke Kuroyanagi
4867c855ea6f882190d73df9d3fae0b56929fd6888Keisuke Kuroyanagi    static bool needsToDecay(const bool mindsBlockByDecay, const int unigramCount,
4957816c7a8bac1a47913da7a503ece2b5dd7cc0fcKeisuke Kuroyanagi            const int bigramCount, const HeaderPolicy *const headerPolicy);
50fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi
515128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi    AK_FORCE_INLINE static int getUnigramCountHardLimit(const int maxUnigramCount) {
525128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi        return static_cast<int>(static_cast<float>(maxUnigramCount)
535128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi                * UNIGRAM_COUNT_HARD_LIMIT_WEIGHT);
545128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi    }
555128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi
565128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi    AK_FORCE_INLINE static int getBigramCountHardLimit(const int maxBigramCount) {
575128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi        return static_cast<int>(static_cast<float>(maxBigramCount)
585128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi                * BIGRAM_COUNT_HARD_LIMIT_WEIGHT);
595128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi    }
605128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi
61fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi private:
6213d5dc914aae5cb6bf6ef06aa05643514a40318cKeisuke Kuroyanagi    DISALLOW_IMPLICIT_CONSTRUCTORS(ForgettingCurveUtils);
63fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi
647c4dcf1e918c2b9251e7aa907d991a3ab8764bafKeisuke Kuroyanagi    class ProbabilityTable {
657c4dcf1e918c2b9251e7aa907d991a3ab8764bafKeisuke Kuroyanagi     public:
667c4dcf1e918c2b9251e7aa907d991a3ab8764bafKeisuke Kuroyanagi        ProbabilityTable();
677c4dcf1e918c2b9251e7aa907d991a3ab8764bafKeisuke Kuroyanagi
6857816c7a8bac1a47913da7a503ece2b5dd7cc0fcKeisuke Kuroyanagi        int getProbability(const int tableId, const int level,
6957816c7a8bac1a47913da7a503ece2b5dd7cc0fcKeisuke Kuroyanagi                const int elapsedTimeStepCount) const {
7057816c7a8bac1a47913da7a503ece2b5dd7cc0fcKeisuke Kuroyanagi            return mTables[tableId][level][elapsedTimeStepCount];
717c4dcf1e918c2b9251e7aa907d991a3ab8764bafKeisuke Kuroyanagi        }
727c4dcf1e918c2b9251e7aa907d991a3ab8764bafKeisuke Kuroyanagi
737c4dcf1e918c2b9251e7aa907d991a3ab8764bafKeisuke Kuroyanagi     private:
747c4dcf1e918c2b9251e7aa907d991a3ab8764bafKeisuke Kuroyanagi        DISALLOW_COPY_AND_ASSIGN(ProbabilityTable);
757c4dcf1e918c2b9251e7aa907d991a3ab8764bafKeisuke Kuroyanagi
7657816c7a8bac1a47913da7a503ece2b5dd7cc0fcKeisuke Kuroyanagi        static const int PROBABILITY_TABLE_COUNT;
7770566266be1781100c673addca5af1960a0eedf8Keisuke Kuroyanagi        static const int WEAK_PROBABILITY_TABLE_ID;
7870566266be1781100c673addca5af1960a0eedf8Keisuke Kuroyanagi        static const int MODEST_PROBABILITY_TABLE_ID;
7970566266be1781100c673addca5af1960a0eedf8Keisuke Kuroyanagi        static const int STRONG_PROBABILITY_TABLE_ID;
8070566266be1781100c673addca5af1960a0eedf8Keisuke Kuroyanagi        static const int AGGRESSIVE_PROBABILITY_TABLE_ID;
8170566266be1781100c673addca5af1960a0eedf8Keisuke Kuroyanagi
823d70932857ce97631635c132ce2dbc38ecb0e731Keisuke Kuroyanagi        static const int WEAK_MAX_PROBABILITY;
8370566266be1781100c673addca5af1960a0eedf8Keisuke Kuroyanagi        static const int MODEST_BASE_PROBABILITY;
8470566266be1781100c673addca5af1960a0eedf8Keisuke Kuroyanagi        static const int STRONG_BASE_PROBABILITY;
8570566266be1781100c673addca5af1960a0eedf8Keisuke Kuroyanagi        static const int AGGRESSIVE_BASE_PROBABILITY;
8657816c7a8bac1a47913da7a503ece2b5dd7cc0fcKeisuke Kuroyanagi
870b1fa0c1c7572893365c019780357a817158e5eaKen Wakasa        std::vector<std::vector<std::vector<int>>> mTables;
8870566266be1781100c673addca5af1960a0eedf8Keisuke Kuroyanagi
8970566266be1781100c673addca5af1960a0eedf8Keisuke Kuroyanagi        static int getBaseProbabilityForLevel(const int tableId, const int level);
907c4dcf1e918c2b9251e7aa907d991a3ab8764bafKeisuke Kuroyanagi    };
917c4dcf1e918c2b9251e7aa907d991a3ab8764bafKeisuke Kuroyanagi
92b368089dbfabb84d1af4ad76d331b7add849c33bKeisuke Kuroyanagi    static const int MULTIPLIER_TWO_IN_PROBABILITY_SCALE;
9367c855ea6f882190d73df9d3fae0b56929fd6888Keisuke Kuroyanagi    static const int DECAY_INTERVAL_SECONDS;
94fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi
952fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    static const int MAX_LEVEL;
969d7e8c717f56a8b706a174fd3d5a2864d08d320cKeisuke Kuroyanagi    static const int MIN_VISIBLE_LEVEL;
972fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    static const int MAX_ELAPSED_TIME_STEP_COUNT;
982fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    static const int DISCARD_LEVEL_ZERO_ENTRY_TIME_STEP_COUNT_THRESHOLD;
995128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi
1005128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi    static const float UNIGRAM_COUNT_HARD_LIMIT_WEIGHT;
1015128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi    static const float BIGRAM_COUNT_HARD_LIMIT_WEIGHT;
102fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi
1032fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    static const ProbabilityTable sProbabilityTable;
104fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi
105c76bbceedc804d1f2988cbf032b530a107a7d561Keisuke Kuroyanagi    static int backoff(const int unigramProbability);
1065128935ac4d7961e3c863270b828e47a79b97235Keisuke Kuroyanagi    static int getElapsedTimeStepCount(const int timestamp, const int durationToLevelDown);
1079d7e8c717f56a8b706a174fd3d5a2864d08d320cKeisuke Kuroyanagi    static int clampToVisibleEntryLevelRange(const int level);
1089d7e8c717f56a8b706a174fd3d5a2864d08d320cKeisuke Kuroyanagi    static int clampToValidLevelRange(const int level);
1099d7e8c717f56a8b706a174fd3d5a2864d08d320cKeisuke Kuroyanagi    static int clampToValidCountRange(const int count, const HeaderPolicy *const headerPolicy);
1109d7e8c717f56a8b706a174fd3d5a2864d08d320cKeisuke Kuroyanagi    static int clampToValidTimeStepCountRange(const int timeStepCount);
111fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi};
112fd02b2d6ee55d4aee7faab89a7a2b72764eafc47Keisuke Kuroyanagi} // namespace latinime
11313d5dc914aae5cb6bf6ef06aa05643514a40318cKeisuke Kuroyanagi#endif /* LATINIME_FORGETTING_CURVE_UTILS_H */
114