175a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi/* 275a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * Copyright (C) 2014 The Android Open Source Project 375a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * 475a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License"); 575a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * you may not use this file except in compliance with the License. 675a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * You may obtain a copy of the License at 775a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * 875a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * http://www.apache.org/licenses/LICENSE-2.0 975a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * 1075a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software 1175a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS, 1275a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1375a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * See the License for the specific language governing permissions and 1475a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * limitations under the License. 1575a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi */ 1675a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi 1775a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagipackage com.android.inputmethod.latin.makedict; 1875a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi 19aa7abb2d89e559d3e8969b35fe2c75a8793495f1Keisuke Kuroyanagiimport com.android.inputmethod.annotations.UsedForTesting; 2075a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagiimport com.android.inputmethod.latin.BinaryDictionary; 21b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagiimport com.android.inputmethod.latin.utils.CombinedFormatUtils; 2275a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi 235f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagiimport java.util.Arrays; 245f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi 2575a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagipublic final class ProbabilityInfo { 2675a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi public final int mProbability; 2775a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi // mTimestamp, mLevel and mCount are historical info. These values are depend on the 2875a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi // implementation in native code; thus, we must not use them and have any assumptions about 2975a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi // them except for tests. 3075a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi public final int mTimestamp; 3175a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi public final int mLevel; 3275a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi public final int mCount; 3375a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi 34aa7abb2d89e559d3e8969b35fe2c75a8793495f1Keisuke Kuroyanagi @UsedForTesting 358ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi public static ProbabilityInfo max(final ProbabilityInfo probabilityInfo1, 368ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi final ProbabilityInfo probabilityInfo2) { 378ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi if (probabilityInfo1 == null) { 388ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi return probabilityInfo2; 398ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi } 408ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi if (probabilityInfo2 == null) { 418ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi return probabilityInfo1; 428ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi } 435f00fe09e9a611b647592188316e5999465df4d3Tadashi G. Takaoka return (probabilityInfo1.mProbability > probabilityInfo2.mProbability) ? probabilityInfo1 445f00fe09e9a611b647592188316e5999465df4d3Tadashi G. Takaoka : probabilityInfo2; 458ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi } 468ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi 4775a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi public ProbabilityInfo(final int probability) { 4875a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi this(probability, BinaryDictionary.NOT_A_VALID_TIMESTAMP, 0, 0); 4975a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi } 5075a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi 5175a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi public ProbabilityInfo(final int probability, final int timestamp, final int level, 5275a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi final int count) { 5375a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi mProbability = probability; 5475a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi mTimestamp = timestamp; 5575a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi mLevel = level; 5675a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi mCount = count; 5775a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi } 5875a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi 59df1d3e733e2b000c776e74b54d3c62f0d433b013Keisuke Kuroyanagi public boolean hasHistoricalInfo() { 60df1d3e733e2b000c776e74b54d3c62f0d433b013Keisuke Kuroyanagi return mTimestamp != BinaryDictionary.NOT_A_VALID_TIMESTAMP; 61df1d3e733e2b000c776e74b54d3c62f0d433b013Keisuke Kuroyanagi } 62df1d3e733e2b000c776e74b54d3c62f0d433b013Keisuke Kuroyanagi 6375a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi @Override 645f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi public int hashCode() { 655f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi if (hasHistoricalInfo()) { 665f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi return Arrays.hashCode(new Object[] { mProbability, mTimestamp, mLevel, mCount }); 675f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi } 685f00fe09e9a611b647592188316e5999465df4d3Tadashi G. Takaoka return Arrays.hashCode(new Object[] { mProbability }); 695f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi } 705f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi 715f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi @Override 7275a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi public String toString() { 73b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi return CombinedFormatUtils.formatProbabilityInfo(this); 7475a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi } 75df1d3e733e2b000c776e74b54d3c62f0d433b013Keisuke Kuroyanagi 76df1d3e733e2b000c776e74b54d3c62f0d433b013Keisuke Kuroyanagi @Override 77df1d3e733e2b000c776e74b54d3c62f0d433b013Keisuke Kuroyanagi public boolean equals(Object o) { 785f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi if (o == this) return true; 795f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi if (!(o instanceof ProbabilityInfo)) return false; 805f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi final ProbabilityInfo p = (ProbabilityInfo)o; 815f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi if (!hasHistoricalInfo() && !p.hasHistoricalInfo()) { 825f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi return mProbability == p.mProbability; 835f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi } 845f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi return mProbability == p.mProbability && mTimestamp == p.mTimestamp && mLevel == p.mLevel 855f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi && mCount == p.mCount; 865f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi } 8775a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi}