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

Commit 4e17b42d authored by Keisuke Kuroyanagi's avatar Keisuke Kuroyanagi Committed by Jean Chalard
Browse files

Output input index of second word's first char.

This is for partial commit.

Bug: 9059617

Change-Id: I77a0245b63c29b7234fd9b06d362e05aebf30051
parent 060917ed
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -143,7 +143,7 @@ class DicNode {
                dicNode->mDicNodeState.mDicNodeStatePrevWord.getPrevWordLength(),
                dicNode->getOutputWordBuf(),
                dicNode->mDicNodeProperties.getDepth(),
                dicNode->mDicNodeState.mDicNodeStatePrevWord.mPrevSpacePositions,
                dicNode->mDicNodeState.mDicNodeStatePrevWord.getSecondWordFirstInputIndex(),
                mDicNodeState.mDicNodeStateInput.getInputIndex(0) /* lastInputIndex */);
        PROF_NODE_COPY(&dicNode->mProfiler, mProfiler);
    }
@@ -321,8 +321,13 @@ class DicNode {
        DUMP_WORD_AND_SCORE("OUTPUT");
    }

    void outputSpacePositionsResult(int *spaceIndices) const {
        mDicNodeState.mDicNodeStatePrevWord.outputSpacePositions(spaceIndices);
    int getSecondWordFirstInputIndex(const ProximityInfoState *const pInfoState) const {
        const int inputIndex = mDicNodeState.mDicNodeStatePrevWord.getSecondWordFirstInputIndex();
        if (inputIndex == NOT_AN_INDEX) {
            return NOT_AN_INDEX;
        } else {
            return pInfoState->getInputIndexOfSampledPoint(inputIndex);
        }
    }

    bool hasMultipleWords() const {
@@ -573,7 +578,11 @@ class DicNode {
        }
    }

    AK_FORCE_INLINE void updateInputIndexG(DicNode_InputStateG *inputStateG) {
    AK_FORCE_INLINE void updateInputIndexG(const DicNode_InputStateG *const inputStateG) {
        if (mDicNodeState.mDicNodeStatePrevWord.getPrevWordCount() == 1 && isFirstLetter()) {
            mDicNodeState.mDicNodeStatePrevWord.setSecondWordFirstInputIndex(
                    inputStateG->mInputIndex);
        }
        mDicNodeState.mDicNodeStateInput.updateInputIndexG(inputStateG->mPointerId,
                inputStateG->mInputIndex, inputStateG->mPrevCodePoint,
                inputStateG->mTerminalDiffCost, inputStateG->mRawLength);
+15 −16
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@

#include "defines.h"
#include "suggest/core/dicnode/dic_node_utils.h"
#include "suggest/core/layout/proximity_info_state.h"

namespace latinime {

@@ -29,9 +30,8 @@ class DicNodeStatePrevWord {
 public:
    AK_FORCE_INLINE DicNodeStatePrevWord()
            : mPrevWordCount(0), mPrevWordLength(0), mPrevWordStart(0), mPrevWordProbability(0),
              mPrevWordNodePos(NOT_A_DICT_POS) {
              mPrevWordNodePos(NOT_A_DICT_POS), mSecondWordFirstInputIndex(NOT_AN_INDEX) {
        memset(mPrevWord, 0, sizeof(mPrevWord));
        memset(mPrevSpacePositions, 0, sizeof(mPrevSpacePositions));
    }

    virtual ~DicNodeStatePrevWord() {}
@@ -42,7 +42,7 @@ class DicNodeStatePrevWord {
        mPrevWordStart = 0;
        mPrevWordProbability = -1;
        mPrevWordNodePos = NOT_A_DICT_POS;
        memset(mPrevSpacePositions, 0, sizeof(mPrevSpacePositions));
        mSecondWordFirstInputIndex = NOT_AN_INDEX;
    }

    void init(const int prevWordNodePos) {
@@ -51,7 +51,7 @@ class DicNodeStatePrevWord {
        mPrevWordStart = 0;
        mPrevWordProbability = -1;
        mPrevWordNodePos = prevWordNodePos;
        memset(mPrevSpacePositions, 0, sizeof(mPrevSpacePositions));
        mSecondWordFirstInputIndex = NOT_AN_INDEX;
    }

    // Init by copy
@@ -61,14 +61,14 @@ class DicNodeStatePrevWord {
        mPrevWordStart = prevWord->mPrevWordStart;
        mPrevWordProbability = prevWord->mPrevWordProbability;
        mPrevWordNodePos = prevWord->mPrevWordNodePos;
        mSecondWordFirstInputIndex = prevWord->mSecondWordFirstInputIndex;
        memcpy(mPrevWord, prevWord->mPrevWord, prevWord->mPrevWordLength * sizeof(mPrevWord[0]));
        memcpy(mPrevSpacePositions, prevWord->mPrevSpacePositions, sizeof(mPrevSpacePositions));
    }

    void init(const int16_t prevWordCount, const int16_t prevWordProbability,
            const int prevWordNodePos, const int *const src0, const int16_t length0,
            const int *const src1, const int16_t length1, const int *const prevSpacePositions,
            const int lastInputIndex) {
            const int *const src1, const int16_t length1,
            const int prevWordSecondWordFirstInputIndex, const int lastInputIndex) {
        mPrevWordCount = min(prevWordCount, static_cast<int16_t>(MAX_RESULTS));
        mPrevWordProbability = prevWordProbability;
        mPrevWordNodePos = prevWordNodePos;
@@ -80,8 +80,7 @@ class DicNodeStatePrevWord {
        mPrevWord[twoWordsLen] = KEYCODE_SPACE;
        mPrevWordStart = length0;
        mPrevWordLength = static_cast<int16_t>(twoWordsLen + 1);
        memcpy(mPrevSpacePositions, prevSpacePositions, sizeof(mPrevSpacePositions));
        mPrevSpacePositions[mPrevWordCount - 1] = lastInputIndex;
        mSecondWordFirstInputIndex = prevWordSecondWordFirstInputIndex;
    }

    void truncate(const int offset) {
@@ -96,11 +95,12 @@ class DicNodeStatePrevWord {
        mPrevWordLength = newPrevWordLength;
    }

    void outputSpacePositions(int *spaceIndices) const {
        // Convert uint16_t to int
        for (int i = 0; i < MAX_RESULTS; i++) {
            spaceIndices[i] = mPrevSpacePositions[i];
    void setSecondWordFirstInputIndex(const int inputIndex) {
        mSecondWordFirstInputIndex = inputIndex;
    }

    int getSecondWordFirstInputIndex() const {
        return mSecondWordFirstInputIndex;
    }

    // TODO: remove
@@ -138,8 +138,6 @@ class DicNodeStatePrevWord {

    // TODO: Move to private
    int mPrevWord[MAX_WORD_LENGTH];
    // TODO: Move to private
    int mPrevSpacePositions[MAX_RESULTS];

 private:
    // Caution!!!
@@ -150,6 +148,7 @@ class DicNodeStatePrevWord {
    int16_t mPrevWordStart;
    int16_t mPrevWordProbability;
    int mPrevWordNodePos;
    int mSecondWordFirstInputIndex;
};
} // namespace latinime
#endif // LATINIME_DIC_NODE_STATE_PREVWORD_H
+4 −0
Original line number Diff line number Diff line
@@ -130,6 +130,10 @@ class ProximityInfoState {
        return mSampledInputYs[index];
    }

    int getInputIndexOfSampledPoint(const int sampledIndex) const {
        return mSampledInputIndice[sampledIndex];
    }

    bool hasSpaceProximity(const int index) const;

    int getLengthCache(const int index) const {
+3 −1
Original line number Diff line number Diff line
@@ -113,7 +113,9 @@ class DicTraverseSession {
        if (usedPointerCount != 1) {
            return false;
        }
        if (pointerId) {
            *pointerId = usedPointerId;
        }
        return true;
    }

+27 −9
Original line number Diff line number Diff line
@@ -117,7 +117,7 @@ void Suggest::initializeSearch(DicTraverseSession *traverseSession, int commitPo
 * Outputs the final list of suggestions (i.e., terminal nodes).
 */
int Suggest::outputSuggestions(DicTraverseSession *traverseSession, int *frequencies,
        int *outputCodePoints, int *spaceIndices, int *outputTypes) const {
        int *outputCodePoints, int *outputIndicesToPartialCommit, int *outputTypes) const {
#if DEBUG_EVALUATE_MOST_PROBABLE_STRING
    const int terminalSize = 0;
#else
@@ -139,6 +139,7 @@ int Suggest::outputSuggestions(DicTraverseSession *traverseSession, int *frequen
            SCORING->getMostProbableString(traverseSession, terminalSize, languageWeight,
                    &outputCodePoints[0], &outputTypes[0], &frequencies[0]);
    if (hasMostProbableString) {
        outputIndicesToPartialCommit[outputWordIndex] = NOT_AN_INDEX;
        ++outputWordIndex;
    }

@@ -160,6 +161,9 @@ int Suggest::outputSuggestions(DicTraverseSession *traverseSession, int *frequen
                            || (traverseSession->getInputSize()
                                    >= MIN_LEN_FOR_MULTI_WORD_AUTOCORRECT
                                            && terminals[0].hasMultipleWords())) : false;
    // TODO: have partial commit work even with multiple pointers.
    const bool outputSecondWordFirstLetterInputIndex =
            traverseSession->isOnlyOnePointerUsed(0 /* pointerId */);
    // Output suggestion results here
    for (int terminalIndex = 0; terminalIndex < terminalSize && outputWordIndex < MAX_RESULTS;
            ++terminalIndex) {
@@ -194,18 +198,21 @@ int Suggest::outputSuggestions(DicTraverseSession *traverseSession, int *frequen
                terminalDicNode->isExactMatch()
                        || (forceCommitMultiWords && terminalDicNode->hasMultipleWords())
                                || (isValidWord && SCORING->doesAutoCorrectValidWord()));
        maxScore = max(maxScore, finalScore);

        // TODO: Implement a smarter auto-commit method for handling multi-word suggestions.
        // Index for top typing suggestion should be 0.
        if (isValidWord && outputWordIndex == 0) {
            terminalDicNode->outputSpacePositionsResult(spaceIndices);
        if (maxScore < finalScore && isValidWord) {
            maxScore = finalScore;
        }

        // Don't output invalid words. However, we still need to submit their shortcuts if any.
        if (isValidWord) {
            outputTypes[outputWordIndex] = Dictionary::KIND_CORRECTION | outputTypeFlags;
            frequencies[outputWordIndex] = finalScore;
            if (outputSecondWordFirstLetterInputIndex) {
                outputIndicesToPartialCommit[outputWordIndex] =
                        terminalDicNode->getSecondWordFirstInputIndex(
                                traverseSession->getProximityInfoState(0));
            } else {
                outputIndicesToPartialCommit[outputWordIndex] = NOT_AN_INDEX;
            }
            // Populate the outputChars array with the suggested word.
            const int startIndex = outputWordIndex * MAX_WORD_LENGTH;
            terminalDicNode->outputResult(&outputCodePoints[startIndex]);
@@ -220,8 +227,19 @@ int Suggest::outputSuggestions(DicTraverseSession *traverseSession, int *frequen
            // Shortcut is not supported for multiple words suggestions.
            // TODO: Check shortcuts during traversal for multiple words suggestions.
            const bool sameAsTyped = TRAVERSAL->sameAsTyped(traverseSession, terminalDicNode);
            outputWordIndex = ShortcutUtils::outputShortcuts(&shortcutIt, outputWordIndex,
                    finalScore, outputCodePoints, frequencies, outputTypes, sameAsTyped);
            const int updatedOutputWordIndex = ShortcutUtils::outputShortcuts(&shortcutIt,
                    outputWordIndex,  finalScore, outputCodePoints, frequencies, outputTypes,
                    sameAsTyped);
            const int secondWordFirstInputIndex = terminalDicNode->getSecondWordFirstInputIndex(
                    traverseSession->getProximityInfoState(0));
            for (int i = outputWordIndex; i < updatedOutputWordIndex; ++i) {
                if (outputSecondWordFirstLetterInputIndex) {
                    outputIndicesToPartialCommit[i] = secondWordFirstInputIndex;
                } else {
                    outputIndicesToPartialCommit[i] = NOT_AN_INDEX;
                }
            }
            outputWordIndex = updatedOutputWordIndex;
        }
        DicNode::managedDelete(terminalDicNode);
    }
Loading