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

Commit 94d9a230 authored by Keisuke Kuroyanagi's avatar Keisuke Kuroyanagi
Browse files

Extend jni interface to get bigrams in WordProperty.

Bug: 12810574
Change-Id: Ia4b88d02ea8790a5c47d32376cc0b84c3e071ddd
parent 17e7768a
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