Loading java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java +2 −2 Original line number Diff line number Diff line Loading @@ -511,7 +511,7 @@ public final class BinaryDictDecoderUtils { final WeightedString word = getWordAtPosition(dictDecoder, headerSize, bigram.mAddress, options); final int reconstructedFrequency = BinaryDictIOUtils.reconstructBigramFrequency(word.mFrequency, BinaryDictIOUtils.reconstructBigramFrequency(word.getProbability(), bigram.mFrequency); bigrams.add(new WeightedString(word.mWord, reconstructedFrequency)); } Loading Loading @@ -618,7 +618,7 @@ public final class BinaryDictDecoderUtils { // words that are not also registered as unigrams so we don't have to avoid // them explicitly here. for (final WeightedString bigram : w.mBigrams) { newDict.setBigram(w.mWord, bigram.mWord, bigram.mFrequency); newDict.setBigram(w.mWord, bigram.mWord, bigram.getProbability()); } } } Loading java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java +26 −15 Original line number Diff line number Diff line Loading @@ -67,29 +67,40 @@ public final class FusionDictionary implements Iterable<Word> { } /** * A string with a frequency. * A string with a probability. * * This represents an "attribute", that is either a bigram or a shortcut. */ public static final class WeightedString { public final String mWord; public int mFrequency; public WeightedString(String word, int frequency) { public ProbabilityInfo mProbabilityInfo; public WeightedString(final String word, final int probability) { mWord = word; mFrequency = frequency; mProbabilityInfo = new ProbabilityInfo(probability); } public int getProbability() { return mProbabilityInfo.mProbability; } public void setProbability(final int probability) { mProbabilityInfo = new ProbabilityInfo(probability); } @Override public int hashCode() { return Arrays.hashCode(new Object[] { mWord, mFrequency }); return Arrays.hashCode(new Object[] { mWord, mProbabilityInfo.mProbability, mProbabilityInfo.mTimestamp, mProbabilityInfo.mLevel, mProbabilityInfo.mCount }); } @Override public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof WeightedString)) return false; WeightedString w = (WeightedString)o; return mWord.equals(w.mWord) && mFrequency == w.mFrequency; final WeightedString w = (WeightedString)o; return mWord.equals(w.mWord) && mProbabilityInfo.equals(w.mProbabilityInfo); } } Loading Loading @@ -200,18 +211,18 @@ public final class FusionDictionary implements Iterable<Word> { } /** * Adds a word to the bigram list. Updates the frequency if the word already * Adds a word to the bigram list. Updates the probability if the word already * exists. */ public void addBigram(final String word, final int frequency) { public void addBigram(final String word, final int probability) { if (mBigrams == null) { mBigrams = new ArrayList<WeightedString>(); } WeightedString bigram = getBigram(word); if (bigram != null) { bigram.mFrequency = frequency; bigram.setProbability(probability); } else { bigram = new WeightedString(word, frequency); bigram = new WeightedString(word, probability); mBigrams.add(bigram); } } Loading Loading @@ -273,8 +284,8 @@ public final class FusionDictionary implements Iterable<Word> { final WeightedString existingShortcut = getShortcut(shortcut.mWord); if (existingShortcut == null) { mShortcutTargets.add(shortcut); } else if (existingShortcut.mFrequency < shortcut.mFrequency) { existingShortcut.mFrequency = shortcut.mFrequency; } else if (existingShortcut.getProbability() < shortcut.getProbability()) { existingShortcut.setProbability(shortcut.getProbability()); } } } Loading @@ -289,8 +300,8 @@ public final class FusionDictionary implements Iterable<Word> { final WeightedString existingBigram = getBigram(bigram.mWord); if (existingBigram == null) { mBigrams.add(bigram); } else if (existingBigram.mFrequency < bigram.mFrequency) { existingBigram.mFrequency = bigram.mFrequency; } else if (existingBigram.getProbability() < bigram.getProbability()) { existingBigram.setProbability(bigram.getProbability()); } } } Loading java/src/com/android/inputmethod/latin/makedict/ProbabilityInfo.java +17 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.inputmethod.latin.makedict; import com.android.inputmethod.latin.BinaryDictionary; import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString; public final class ProbabilityInfo { public final int mProbability; Loading @@ -39,8 +40,24 @@ public final class ProbabilityInfo { mCount = count; } public boolean hasHistoricalInfo() { return mTimestamp != BinaryDictionary.NOT_A_VALID_TIMESTAMP; } @Override public String toString() { return mTimestamp + ":" + mLevel + ":" + mCount; } @Override public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof ProbabilityInfo)) return false; final ProbabilityInfo p = (ProbabilityInfo)o; if (!hasHistoricalInfo() && !p.hasHistoricalInfo()) { return mProbability == p.mProbability; } return mProbability == p.mProbability && mTimestamp == p.mTimestamp && mLevel == p.mLevel && mCount == p.mCount; } } No newline at end of file java/src/com/android/inputmethod/latin/makedict/Ver2DictEncoder.java +2 −2 Original line number Diff line number Diff line Loading @@ -197,7 +197,7 @@ public class Ver2DictEncoder implements DictEncoder { final WeightedString target = shortcutIterator.next(); final int shortcutFlags = BinaryDictEncoderUtils.makeShortcutFlags( shortcutIterator.hasNext(), target.mFrequency); target.getProbability()); mPosition = BinaryDictEncoderUtils.writeUIntToBuffer(mBuffer, mPosition, shortcutFlags, FormatSpec.PTNODE_ATTRIBUTE_FLAGS_SIZE); final int shortcutShift = CharEncoding.writeString(mBuffer, mPosition, target.mWord); Loading Loading @@ -231,7 +231,7 @@ public class Ver2DictEncoder implements DictEncoder { final int offset = addressOfBigram - (mPosition + FormatSpec.PTNODE_ATTRIBUTE_FLAGS_SIZE); final int bigramFlags = BinaryDictEncoderUtils.makeBigramFlags(bigramIterator.hasNext(), offset, bigram.mFrequency, unigramFrequencyForThisWord, bigram.mWord); offset, bigram.getProbability(), unigramFrequencyForThisWord, bigram.mWord); mPosition = BinaryDictEncoderUtils.writeUIntToBuffer(mBuffer, mPosition, bigramFlags, FormatSpec.PTNODE_ATTRIBUTE_FLAGS_SIZE); mPosition += BinaryDictEncoderUtils.writeChildrenPosition(mBuffer, mPosition, Loading java/src/com/android/inputmethod/latin/makedict/Ver4DictEncoder.java +2 −2 Original line number Diff line number Diff line Loading @@ -80,7 +80,7 @@ public class Ver4DictEncoder implements DictEncoder { } else { for (final WeightedString shortcutTarget : word.mShortcutTargets) { binaryDict.addUnigramWord(word.mWord, word.mFrequency, shortcutTarget.mWord, shortcutTarget.mFrequency, shortcutTarget.mWord, shortcutTarget.getProbability(), word.mIsNotAWord, word.mIsBlacklistEntry, 0 /* timestamp */); } } Loading @@ -91,7 +91,7 @@ public class Ver4DictEncoder implements DictEncoder { for (final Word word0 : dict) { if (null == word0.mBigrams) continue; for (final WeightedString word1 : word0.mBigrams) { binaryDict.addBigramWords(word0.mWord, word1.mWord, word1.mFrequency, binaryDict.addBigramWords(word0.mWord, word1.mWord, word1.getProbability(), 0 /* timestamp */); if (binaryDict.needsToRunGC(true /* mindsBlockByGC */)) { binaryDict.flushWithGC(); Loading Loading
java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java +2 −2 Original line number Diff line number Diff line Loading @@ -511,7 +511,7 @@ public final class BinaryDictDecoderUtils { final WeightedString word = getWordAtPosition(dictDecoder, headerSize, bigram.mAddress, options); final int reconstructedFrequency = BinaryDictIOUtils.reconstructBigramFrequency(word.mFrequency, BinaryDictIOUtils.reconstructBigramFrequency(word.getProbability(), bigram.mFrequency); bigrams.add(new WeightedString(word.mWord, reconstructedFrequency)); } Loading Loading @@ -618,7 +618,7 @@ public final class BinaryDictDecoderUtils { // words that are not also registered as unigrams so we don't have to avoid // them explicitly here. for (final WeightedString bigram : w.mBigrams) { newDict.setBigram(w.mWord, bigram.mWord, bigram.mFrequency); newDict.setBigram(w.mWord, bigram.mWord, bigram.getProbability()); } } } Loading
java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java +26 −15 Original line number Diff line number Diff line Loading @@ -67,29 +67,40 @@ public final class FusionDictionary implements Iterable<Word> { } /** * A string with a frequency. * A string with a probability. * * This represents an "attribute", that is either a bigram or a shortcut. */ public static final class WeightedString { public final String mWord; public int mFrequency; public WeightedString(String word, int frequency) { public ProbabilityInfo mProbabilityInfo; public WeightedString(final String word, final int probability) { mWord = word; mFrequency = frequency; mProbabilityInfo = new ProbabilityInfo(probability); } public int getProbability() { return mProbabilityInfo.mProbability; } public void setProbability(final int probability) { mProbabilityInfo = new ProbabilityInfo(probability); } @Override public int hashCode() { return Arrays.hashCode(new Object[] { mWord, mFrequency }); return Arrays.hashCode(new Object[] { mWord, mProbabilityInfo.mProbability, mProbabilityInfo.mTimestamp, mProbabilityInfo.mLevel, mProbabilityInfo.mCount }); } @Override public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof WeightedString)) return false; WeightedString w = (WeightedString)o; return mWord.equals(w.mWord) && mFrequency == w.mFrequency; final WeightedString w = (WeightedString)o; return mWord.equals(w.mWord) && mProbabilityInfo.equals(w.mProbabilityInfo); } } Loading Loading @@ -200,18 +211,18 @@ public final class FusionDictionary implements Iterable<Word> { } /** * Adds a word to the bigram list. Updates the frequency if the word already * Adds a word to the bigram list. Updates the probability if the word already * exists. */ public void addBigram(final String word, final int frequency) { public void addBigram(final String word, final int probability) { if (mBigrams == null) { mBigrams = new ArrayList<WeightedString>(); } WeightedString bigram = getBigram(word); if (bigram != null) { bigram.mFrequency = frequency; bigram.setProbability(probability); } else { bigram = new WeightedString(word, frequency); bigram = new WeightedString(word, probability); mBigrams.add(bigram); } } Loading Loading @@ -273,8 +284,8 @@ public final class FusionDictionary implements Iterable<Word> { final WeightedString existingShortcut = getShortcut(shortcut.mWord); if (existingShortcut == null) { mShortcutTargets.add(shortcut); } else if (existingShortcut.mFrequency < shortcut.mFrequency) { existingShortcut.mFrequency = shortcut.mFrequency; } else if (existingShortcut.getProbability() < shortcut.getProbability()) { existingShortcut.setProbability(shortcut.getProbability()); } } } Loading @@ -289,8 +300,8 @@ public final class FusionDictionary implements Iterable<Word> { final WeightedString existingBigram = getBigram(bigram.mWord); if (existingBigram == null) { mBigrams.add(bigram); } else if (existingBigram.mFrequency < bigram.mFrequency) { existingBigram.mFrequency = bigram.mFrequency; } else if (existingBigram.getProbability() < bigram.getProbability()) { existingBigram.setProbability(bigram.getProbability()); } } } Loading
java/src/com/android/inputmethod/latin/makedict/ProbabilityInfo.java +17 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.inputmethod.latin.makedict; import com.android.inputmethod.latin.BinaryDictionary; import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString; public final class ProbabilityInfo { public final int mProbability; Loading @@ -39,8 +40,24 @@ public final class ProbabilityInfo { mCount = count; } public boolean hasHistoricalInfo() { return mTimestamp != BinaryDictionary.NOT_A_VALID_TIMESTAMP; } @Override public String toString() { return mTimestamp + ":" + mLevel + ":" + mCount; } @Override public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof ProbabilityInfo)) return false; final ProbabilityInfo p = (ProbabilityInfo)o; if (!hasHistoricalInfo() && !p.hasHistoricalInfo()) { return mProbability == p.mProbability; } return mProbability == p.mProbability && mTimestamp == p.mTimestamp && mLevel == p.mLevel && mCount == p.mCount; } } No newline at end of file
java/src/com/android/inputmethod/latin/makedict/Ver2DictEncoder.java +2 −2 Original line number Diff line number Diff line Loading @@ -197,7 +197,7 @@ public class Ver2DictEncoder implements DictEncoder { final WeightedString target = shortcutIterator.next(); final int shortcutFlags = BinaryDictEncoderUtils.makeShortcutFlags( shortcutIterator.hasNext(), target.mFrequency); target.getProbability()); mPosition = BinaryDictEncoderUtils.writeUIntToBuffer(mBuffer, mPosition, shortcutFlags, FormatSpec.PTNODE_ATTRIBUTE_FLAGS_SIZE); final int shortcutShift = CharEncoding.writeString(mBuffer, mPosition, target.mWord); Loading Loading @@ -231,7 +231,7 @@ public class Ver2DictEncoder implements DictEncoder { final int offset = addressOfBigram - (mPosition + FormatSpec.PTNODE_ATTRIBUTE_FLAGS_SIZE); final int bigramFlags = BinaryDictEncoderUtils.makeBigramFlags(bigramIterator.hasNext(), offset, bigram.mFrequency, unigramFrequencyForThisWord, bigram.mWord); offset, bigram.getProbability(), unigramFrequencyForThisWord, bigram.mWord); mPosition = BinaryDictEncoderUtils.writeUIntToBuffer(mBuffer, mPosition, bigramFlags, FormatSpec.PTNODE_ATTRIBUTE_FLAGS_SIZE); mPosition += BinaryDictEncoderUtils.writeChildrenPosition(mBuffer, mPosition, Loading
java/src/com/android/inputmethod/latin/makedict/Ver4DictEncoder.java +2 −2 Original line number Diff line number Diff line Loading @@ -80,7 +80,7 @@ public class Ver4DictEncoder implements DictEncoder { } else { for (final WeightedString shortcutTarget : word.mShortcutTargets) { binaryDict.addUnigramWord(word.mWord, word.mFrequency, shortcutTarget.mWord, shortcutTarget.mFrequency, shortcutTarget.mWord, shortcutTarget.getProbability(), word.mIsNotAWord, word.mIsBlacklistEntry, 0 /* timestamp */); } } Loading @@ -91,7 +91,7 @@ public class Ver4DictEncoder implements DictEncoder { for (final Word word0 : dict) { if (null == word0.mBigrams) continue; for (final WeightedString word1 : word0.mBigrams) { binaryDict.addBigramWords(word0.mWord, word1.mWord, word1.mFrequency, binaryDict.addBigramWords(word0.mWord, word1.mWord, word1.getProbability(), 0 /* timestamp */); if (binaryDict.needsToRunGC(true /* mindsBlockByGC */)) { binaryDict.flushWithGC(); Loading