Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit df1d3e73 authored by Keisuke Kuroyanagi's avatar Keisuke Kuroyanagi
Browse files

Make WeightedString have ProbabilityInfo.

Bug: 11281877
Bug: 12810574
Change-Id: I265e3d8654c75766cd0e0d09d67ef62b4566298a
parent 75a3df30
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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));
                    }
@@ -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());
                }
            }
        }
+26 −15
Original line number Diff line number Diff line
@@ -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);
        }
    }

@@ -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);
            }
        }
@@ -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());
                        }
                    }
                }
@@ -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());
                        }
                    }
                }
+17 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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
+2 −2
Original line number Diff line number Diff line
@@ -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);
@@ -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,
+2 −2
Original line number Diff line number Diff line
@@ -78,7 +78,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 */);
                }
            }
@@ -89,7 +89,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