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