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

Commit 5ecf74b1 authored by Keisuke Kuroyanagi's avatar Keisuke Kuroyanagi Committed by Android (Google) Code Review
Browse files

Merge "Extend jni interface to get bigrams in WordProperty."

parents 25e71fdc 94d9a230
Loading
Loading
Loading
Loading
+19 −18
Original line number Diff line number Diff line
@@ -68,11 +68,12 @@ public final class BinaryDictionary extends Dictionary {
    private static final int FORMAT_WORD_PROPERTY_HAS_BIGRAMS_INDEX = 2;
    private static final int FORMAT_WORD_PROPERTY_HAS_SHORTCUTS_INDEX = 3;

    // Format to get unigram historical info from native side via getWordPropertyNative().
    private static final int FORMAT_WORD_PROPERTY_OUTPUT_HISTORICAL_INFO_COUNT = 3;
    private static final int FORMAT_WORD_PROPERTY_TIMESTAMP_INDEX = 0;
    private static final int FORMAT_WORD_PROPERTY_LEVEL_INDEX = 1;
    private static final int FORMAT_WORD_PROPERTY_COUNT_INDEX = 2;
    // Format to get probability and historical info from native side via getWordPropertyNative().
    public static final int FORMAT_WORD_PROPERTY_OUTPUT_PROBABILITY_INFO_COUNT = 4;
    public static final int FORMAT_WORD_PROPERTY_PROBABILITY_INDEX = 0;
    public static final int FORMAT_WORD_PROPERTY_TIMESTAMP_INDEX = 1;
    public static final int FORMAT_WORD_PROPERTY_LEVEL_INDEX = 2;
    public static final int FORMAT_WORD_PROPERTY_COUNT_INDEX = 3;

    private long mNativeDict;
    private final Locale mLocale;
@@ -144,9 +145,9 @@ public final class BinaryDictionary extends Dictionary {
    private static native int getProbabilityNative(long dict, int[] word);
    private static native int getBigramProbabilityNative(long dict, int[] word0, int[] word1);
    private static native void getWordPropertyNative(long dict, int[] word,
            int[] outCodePoints, boolean[] outFlags, int[] outProbability,
            int[] outHistoricalInfo, ArrayList<int[]> outShortcutTargets,
            ArrayList<Integer> outShortcutProbabilities);
            int[] outCodePoints, boolean[] outFlags, int[] outProbabilityInfo,
            ArrayList<int[]> outBigramTargets, ArrayList<int[]> outBigramProbabilityInfo,
            ArrayList<int[]> outShortcutTargets, ArrayList<Integer> outShortcutProbabilities);
    private static native int getSuggestionsNative(long dict, long proximityInfo,
            long traverseSession, int[] xCoordinates, int[] yCoordinates, int[] times,
            int[] pointerIds, int[] inputCodePoints, int inputSize, int commitPoint,
@@ -313,22 +314,22 @@ public final class BinaryDictionary extends Dictionary {
        final int[] codePoints = StringUtils.toCodePointArray(word);
        final int[] outCodePoints = new int[MAX_WORD_LENGTH];
        final boolean[] outFlags = new boolean[FORMAT_WORD_PROPERTY_OUTPUT_FLAG_COUNT];
        final int[] outProbability = new int[1];
        final int[] outHistoricalInfo =
                new int[FORMAT_WORD_PROPERTY_OUTPUT_HISTORICAL_INFO_COUNT];
        final int[] outProbabilityInfo =
                new int[FORMAT_WORD_PROPERTY_OUTPUT_PROBABILITY_INFO_COUNT];
        final ArrayList<int[]> outBigramTargets = CollectionUtils.newArrayList();
        final ArrayList<int[]> outBigramProbabilityInfo = CollectionUtils.newArrayList();
        final ArrayList<int[]> outShortcutTargets = CollectionUtils.newArrayList();
        final ArrayList<Integer> outShortcutProbabilities = CollectionUtils.newArrayList();
        getWordPropertyNative(mNativeDict, codePoints, outCodePoints, outFlags, outProbability,
                outHistoricalInfo, outShortcutTargets, outShortcutProbabilities);
        getWordPropertyNative(mNativeDict, codePoints, outCodePoints, outFlags, outProbabilityInfo,
                outBigramTargets, outBigramProbabilityInfo, outShortcutTargets,
                outShortcutProbabilities);
        return new WordProperty(codePoints,
                outFlags[FORMAT_WORD_PROPERTY_IS_NOT_A_WORD_INDEX],
                outFlags[FORMAT_WORD_PROPERTY_IS_BLACKLISTED_INDEX],
                outFlags[FORMAT_WORD_PROPERTY_HAS_BIGRAMS_INDEX],
                outFlags[FORMAT_WORD_PROPERTY_HAS_SHORTCUTS_INDEX], outProbability[0],
                outHistoricalInfo[FORMAT_WORD_PROPERTY_TIMESTAMP_INDEX],
                outHistoricalInfo[FORMAT_WORD_PROPERTY_LEVEL_INDEX],
                outHistoricalInfo[FORMAT_WORD_PROPERTY_COUNT_INDEX],
                outShortcutTargets, outShortcutProbabilities);
                outFlags[FORMAT_WORD_PROPERTY_HAS_SHORTCUTS_INDEX], outProbabilityInfo,
                outBigramTargets, outBigramProbabilityInfo, outShortcutTargets,
                outShortcutProbabilities);
    }

    // Add a unigram entry to binary dictionary with unigram attributes in native code.
+40 −14
Original line number Diff line number Diff line
@@ -32,14 +32,29 @@ public class WordProperty {
    public final boolean mIsBlacklisted;
    public final boolean mHasBigrams;
    public final boolean mHasShortcuts;
    public final ProbabilityInfo mProbabilityInfo;
    public final ArrayList<WeightedString> mBigramTargets = CollectionUtils.newArrayList();
    public final ArrayList<ProbabilityInfo> mBigramProbabilityInfo = CollectionUtils.newArrayList();
    public final ArrayList<WeightedString> mShortcutTargets = CollectionUtils.newArrayList();

    // TODO: Use this kind of Probability class for dictionary read/write code under the makedict
    // package.
    public static final class ProbabilityInfo {
        public final int mProbability;
    // mTimestamp, mLevel and mCount are historical info. These values are depend on the
        // wTimestamp, mLevel and mCount are historical info. These values are depend on the
        // implementation in native code; thus, we must not use them and have any assumptions about
        // them except for tests.
        public final int mTimestamp;
        public final int mLevel;
        public final int mCount;
    public final ArrayList<WeightedString> mShortcutTargets = CollectionUtils.newArrayList();

        public ProbabilityInfo(final int[] probabilityInfo) {
            mProbability = probabilityInfo[BinaryDictionary.FORMAT_WORD_PROPERTY_PROBABILITY_INDEX];
            mTimestamp = probabilityInfo[BinaryDictionary.FORMAT_WORD_PROPERTY_TIMESTAMP_INDEX];
            mLevel = probabilityInfo[BinaryDictionary.FORMAT_WORD_PROPERTY_LEVEL_INDEX];
            mCount = probabilityInfo[BinaryDictionary.FORMAT_WORD_PROPERTY_COUNT_INDEX];
        }
    }

    private static int getCodePointCount(final int[] codePoints) {
        for (int i = 0; i < codePoints.length; i++) {
@@ -53,18 +68,29 @@ public class WordProperty {
    // This represents invalid word when the probability is BinaryDictionary.NOT_A_PROBABILITY.
    public WordProperty(final int[] codePoints, final boolean isNotAWord,
            final boolean isBlacklisted, final boolean hasBigram,
            final boolean hasShortcuts, final int probability, final int timestamp,
            final int level, final int count, final ArrayList<int[]> shortcutTargets,
            final boolean hasShortcuts, final int[] probabilityInfo,
            final ArrayList<int[]> bigramTargets, final ArrayList<int[]> bigramProbabilityInfo,
            final ArrayList<int[]> shortcutTargets,
            final ArrayList<Integer> shortcutProbabilities) {
        mCodePoints = new String(codePoints, 0 /* offset */, getCodePointCount(codePoints));
        mIsNotAWord = isNotAWord;
        mIsBlacklisted = isBlacklisted;
        mHasBigrams = hasBigram;
        mHasShortcuts = hasShortcuts;
        mProbability = probability;
        mTimestamp = timestamp;
        mLevel = level;
        mCount = count;
        mProbabilityInfo = new ProbabilityInfo(probabilityInfo);

        final int bigramTargetCount = bigramTargets.size();
        for (int i = 0; i < bigramTargetCount; i++) {
            final int[] bigramTargetCodePointArray = bigramTargets.get(i);
            final String bigramTargetString = new String(bigramTargetCodePointArray,
                    0 /* offset */, getCodePointCount(bigramTargetCodePointArray));
            final ProbabilityInfo bigramProbability =
                    new ProbabilityInfo(bigramProbabilityInfo.get(i));
            mBigramTargets.add(
                    new WeightedString(bigramTargetString, bigramProbability.mProbability));
            mBigramProbabilityInfo.add(bigramProbability);
        }

        final int shortcutTargetCount = shortcutTargets.size();
        for (int i = 0; i < shortcutTargetCount; i++) {
            final int[] shortcutTargetCodePointArray = shortcutTargets.get(i);
@@ -77,6 +103,6 @@ public class WordProperty {

    @UsedForTesting
    public boolean isValid() {
        return mProbability != BinaryDictionary.NOT_A_PROBABILITY;
        return mProbabilityInfo.mProbability != BinaryDictionary.NOT_A_PROBABILITY;
    }
}
 No newline at end of file
+7 −5
Original line number Diff line number Diff line
@@ -262,16 +262,17 @@ static jint latinime_BinaryDictionary_getBigramProbability(JNIEnv *env, jclass c

static void latinime_BinaryDictionary_getWordProperty(JNIEnv *env, jclass clazz,
        jlong dict, jintArray word, jintArray outCodePoints, jbooleanArray outFlags,
        jintArray outProbability, jintArray outHistoricalInfo, jobject outShortcutTargets,
        jobject outShortcutProbabilities) {
        jintArray outProbabilityInfo, jobject outBigramTargets, jobject outBigramProbabilityInfo,
        jobject outShortcutTargets, jobject outShortcutProbabilities) {
    Dictionary *dictionary = reinterpret_cast<Dictionary *>(dict);
    if (!dictionary) return;
    const jsize wordLength = env->GetArrayLength(word);
    int wordCodePoints[wordLength];
    env->GetIntArrayRegion(word, 0, wordLength, wordCodePoints);
    const WordProperty wordProperty = dictionary->getWordProperty(wordCodePoints, wordLength);
    wordProperty.outputProperties(env, outCodePoints, outFlags, outProbability,
            outHistoricalInfo, outShortcutTargets, outShortcutProbabilities);
    wordProperty.outputProperties(env, outCodePoints, outFlags, outProbabilityInfo,
            outBigramTargets, outBigramProbabilityInfo, outShortcutTargets,
            outShortcutProbabilities);
}

static jfloat latinime_BinaryDictionary_calcNormalizedScore(JNIEnv *env, jclass clazz,
@@ -521,7 +522,8 @@ static const JNINativeMethod sMethods[] = {
    },
    {
        const_cast<char *>("getWordPropertyNative"),
        const_cast<char *>("(J[I[I[Z[I[ILjava/util/ArrayList;Ljava/util/ArrayList;)V"),
        const_cast<char *>("(J[I[I[Z[ILjava/util/ArrayList;Ljava/util/ArrayList;"
                "Ljava/util/ArrayList;Ljava/util/ArrayList;)V"),
        reinterpret_cast<void *>(latinime_BinaryDictionary_getWordProperty)
    },
    {
+9 −6
Original line number Diff line number Diff line
@@ -19,20 +19,23 @@
namespace latinime {

void WordProperty::outputProperties(JNIEnv *const env, jintArray outCodePoints,
        jbooleanArray outFlags, jintArray outProbability, jintArray outHistoricalInfo,
        jobject outShortcutTargets, jobject outShortcutProbabilities) const {
        jbooleanArray outFlags, jintArray outProbabilityInfo, jobject outBigramTargets,
        jobject outBigramProbabilities, jobject outShortcutTargets,
        jobject outShortcutProbabilities) const {
    env->SetIntArrayRegion(outCodePoints, 0 /* start */, mCodePoints.size(), &mCodePoints[0]);
    jboolean flags[] = {mIsNotAWord, mIsBlacklisted, mHasBigrams, mHasShortcuts};
    env->SetBooleanArrayRegion(outFlags, 0 /* start */, NELEMS(flags), flags);
    env->SetIntArrayRegion(outProbability, 0 /* start */, 1 /* len */, &mProbability);
    int historicalInfo[] = {mTimestamp, mLevel, mCount};
    env->SetIntArrayRegion(outHistoricalInfo, 0 /* start */, NELEMS(historicalInfo),
            historicalInfo);
    int probabilityInfo[] = {mProbability, mTimestamp, mLevel, mCount};
    env->SetIntArrayRegion(outProbabilityInfo, 0 /* start */, NELEMS(probabilityInfo),
            probabilityInfo);

    jclass integerClass = env->FindClass("java/lang/Integer");
    jmethodID intToIntegerConstructorId = env->GetMethodID(integerClass, "<init>", "(I)V");
    jclass arrayListClass = env->FindClass("java/util/ArrayList");
    jmethodID addMethodId = env->GetMethodID(arrayListClass, "add", "(Ljava/lang/Object;)Z");

    // TODO: Output bigrams.
    // Output shortcuts.
    const int shortcutTargetCount = mShortcuts.size();
    for (int i = 0; i < shortcutTargetCount; ++i) {
        const std::vector<int> *const targetCodePoints = mShortcuts[i].getTargetCodePoints();
+2 −2
Original line number Diff line number Diff line
@@ -78,8 +78,8 @@ class WordProperty {
              mShortcuts(*shortcuts) {}

    void outputProperties(JNIEnv *const env, jintArray outCodePoints, jbooleanArray outFlags,
            jintArray outProbability, jintArray outHistoricalInfo, jobject outShortcutTargets,
            jobject outShortcutProbabilities) const;
            jintArray outProbabilityInfo, jobject outBigramTargets, jobject outBigramProbabilities,
            jobject outShortcutTargets, jobject outShortcutProbabilities) const;

 private:
    DISALLOW_ASSIGNMENT_OPERATOR(WordProperty);
Loading