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

Commit e591c0bf authored by Keisuke Kuroynagi's avatar Keisuke Kuroynagi Committed by Android Git Automerger
Browse files

am f2edc2a8: am 3261746f: Merge "Fix exact match checking for words with digraph."

* commit 'f2edc2a8':
  Fix exact match checking for words with digraph.
parents e6b7fa93 f2edc2a8
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -438,4 +438,24 @@ typedef enum {
    // Create new word with space substitution
    CT_NEW_WORD_SPACE_SUBSTITUTION,
} CorrectionType;

// ErrorType is mainly decided by CorrectionType but it is also depending on if
// the correction has really been performed or not.
typedef enum {
    // Substitution, omission and transposition
    ET_EDIT_CORRECTION,
    // Proximity error
    ET_PROXIMITY_CORRECTION,
    // Completion
    ET_COMPLETION,
    // New word
    // TODO: Remove.
    // A new word error should be an edit correction error or a proximity correction error.
    ET_NEW_WORD,
    // Treat error as an intentional omission when the CorrectionType is omission and the node can
    // be intentional omission.
    ET_INTENTIONAL_OMISSION,
    // Not treated as an error. Tracked for checking exact match
    ET_NOT_AN_ERROR
} ErrorType;
#endif // LATINIME_DEFINES_H
+6 −3
Original line number Diff line number Diff line
@@ -463,6 +463,10 @@ class DicNode {
        mDicNodeState.mDicNodeStateScoring.advanceDigraphIndex();
    }

    bool isExactMatch() const {
        return mDicNodeState.mDicNodeStateScoring.isExactMatch();
    }

    uint8_t getFlags() const {
        return mDicNodeProperties.getFlags();
    }
@@ -542,13 +546,12 @@ class DicNode {
    // Caveat: Must not be called outside Weighting
    // This restriction is guaranteed by "friend"
    AK_FORCE_INLINE void addCost(const float spatialCost, const float languageCost,
            const bool doNormalization, const int inputSize, const bool isEditCorrection,
            const bool isProximityCorrection) {
            const bool doNormalization, const int inputSize, const ErrorType errorType) {
        if (DEBUG_GEO_FULL) {
            LOGI_SHOW_ADD_COST_PROP;
        }
        mDicNodeState.mDicNodeStateScoring.addCost(spatialCost, languageCost, doNormalization,
                inputSize, getTotalInputIndex(), isEditCorrection, isProximityCorrection);
                inputSize, getTotalInputIndex(), errorType);
    }

    // Caveat: Must not be called outside Weighting
+29 −8
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ class DicNodeStateScoring {
              mDigraphIndex(DigraphUtils::NOT_A_DIGRAPH_INDEX),
              mEditCorrectionCount(0), mProximityCorrectionCount(0),
              mNormalizedCompoundDistance(0.0f), mSpatialDistance(0.0f), mLanguageDistance(0.0f),
              mRawLength(0.0f) {
              mRawLength(0.0f), mExactMatch(true) {
    }

    virtual ~DicNodeStateScoring() {}
@@ -45,6 +45,7 @@ class DicNodeStateScoring {
        mRawLength = 0.0f;
        mDoubleLetterLevel = NOT_A_DOUBLE_LETTER;
        mDigraphIndex = DigraphUtils::NOT_A_DIGRAPH_INDEX;
        mExactMatch = true;
    }

    AK_FORCE_INLINE void init(const DicNodeStateScoring *const scoring) {
@@ -56,17 +57,32 @@ class DicNodeStateScoring {
        mRawLength = scoring->mRawLength;
        mDoubleLetterLevel = scoring->mDoubleLetterLevel;
        mDigraphIndex = scoring->mDigraphIndex;
        mExactMatch = scoring->mExactMatch;
    }

    void addCost(const float spatialCost, const float languageCost, const bool doNormalization,
            const int inputSize, const int totalInputIndex, const bool isEditCorrection,
            const bool isProximityCorrection) {
            const int inputSize, const int totalInputIndex, const ErrorType errorType) {
        addDistance(spatialCost, languageCost, doNormalization, inputSize, totalInputIndex);
        if (isEditCorrection) {
        switch (errorType) {
            case ET_EDIT_CORRECTION:
                ++mEditCorrectionCount;
        }
        if (isProximityCorrection) {
                mExactMatch = false;
                break;
            case ET_PROXIMITY_CORRECTION:
                ++mProximityCorrectionCount;
                mExactMatch = false;
                break;
            case ET_COMPLETION:
                mExactMatch = false;
                break;
            case ET_NEW_WORD:
                mExactMatch = false;
                break;
            case ET_INTENTIONAL_OMISSION:
                mExactMatch = false;
                break;
            case ET_NOT_AN_ERROR:
                break;
        }
    }

@@ -143,6 +159,10 @@ class DicNodeStateScoring {
        }
    }

    bool isExactMatch() const {
        return mExactMatch;
    }

 private:
    // Caution!!!
    // Use a default copy constructor and an assign operator because shallow copies are ok
@@ -157,6 +177,7 @@ class DicNodeStateScoring {
    float mSpatialDistance;
    float mLanguageDistance;
    float mRawLength;
    bool mExactMatch;

    AK_FORCE_INLINE void addDistance(float spatialDistance, float languageDistance,
            bool doNormalization, int inputSize, int totalInputIndex) {
+3 −60
Original line number Diff line number Diff line
@@ -80,9 +80,8 @@ static inline void profile(const CorrectionType correctionType, DicNode *const n
            traverseSession, parentDicNode, dicNode, &inputStateG);
    const float languageCost = Weighting::getLanguageCost(weighting, correctionType,
            traverseSession, parentDicNode, dicNode, bigramCacheMap);
    const bool edit = Weighting::isEditCorrection(correctionType);
    const bool proximity = Weighting::isProximityCorrection(weighting, correctionType,
            traverseSession, dicNode);
    const ErrorType errorType = weighting->getErrorType(correctionType, traverseSession,
            parentDicNode, dicNode);
    profile(correctionType, dicNode);
    if (inputStateG.mNeedsToUpdateInputStateG) {
        dicNode->updateInputIndexG(&inputStateG);
@@ -91,7 +90,7 @@ static inline void profile(const CorrectionType correctionType, DicNode *const n
                (correctionType == CT_TRANSPOSITION));
    }
    dicNode->addCost(spatialCost, languageCost, weighting->needsToNormalizeCompoundDistance(),
            inputSize, edit, proximity);
            inputSize, errorType);
}

/* static */ float Weighting::getSpatialCost(const Weighting *const weighting,
@@ -158,62 +157,6 @@ static inline void profile(const CorrectionType correctionType, DicNode *const n
    }
}

/* static */ bool Weighting::isEditCorrection(const CorrectionType correctionType) {
    switch(correctionType) {
        case CT_OMISSION:
            return true;
        case CT_ADDITIONAL_PROXIMITY:
            return true;
        case CT_SUBSTITUTION:
            return true;
        case CT_NEW_WORD_SPACE_OMITTION:
            return false;
        case CT_MATCH:
            return false;
        case CT_COMPLETION:
            return false;
        case CT_TERMINAL:
            return false;
        case CT_NEW_WORD_SPACE_SUBSTITUTION:
            return false;
        case CT_INSERTION:
            return true;
        case CT_TRANSPOSITION:
            return true;
        default:
            return false;
    }
}

/* static */ bool Weighting::isProximityCorrection(const Weighting *const weighting,
        const CorrectionType correctionType,
        const DicTraverseSession *const traverseSession, const DicNode *const dicNode) {
    switch(correctionType) {
        case CT_OMISSION:
            return false;
        case CT_ADDITIONAL_PROXIMITY:
            return true;
        case CT_SUBSTITUTION:
            return false;
        case CT_NEW_WORD_SPACE_OMITTION:
            return false;
        case CT_MATCH:
            return weighting->isProximityDicNode(traverseSession, dicNode);
        case CT_COMPLETION:
            return false;
        case CT_TERMINAL:
            return false;
        case CT_NEW_WORD_SPACE_SUBSTITUTION:
            return false;
        case CT_INSERTION:
            return false;
        case CT_TRANSPOSITION:
            return false;
        default:
            return false;
    }
}

/* static */ int Weighting::getForwardInputCount(const CorrectionType correctionType) {
    switch(correctionType) {
        case CT_OMISSION:
+4 −6
Original line number Diff line number Diff line
@@ -80,6 +80,10 @@ class Weighting {
    virtual float getSpaceSubstitutionCost(const DicTraverseSession *const traverseSession,
            const DicNode *const dicNode) const = 0;

    virtual ErrorType getErrorType(const CorrectionType correctionType,
            const DicTraverseSession *const traverseSession,
            const DicNode *const parentDicNode, const DicNode *const dicNode) const = 0;

    Weighting() {}
    virtual ~Weighting() {}

@@ -95,12 +99,6 @@ class Weighting {
            const DicNode *const parentDicNode, const DicNode *const dicNode,
            hash_map_compat<int, int16_t> *const bigramCacheMap);
    // TODO: Move to TypingWeighting and GestureWeighting?
    static bool isEditCorrection(const CorrectionType correctionType);
    // TODO: Move to TypingWeighting and GestureWeighting?
    static bool isProximityCorrection(const Weighting *const weighting,
            const CorrectionType correctionType, const DicTraverseSession *const traverseSession,
            const DicNode *const dicNode);
    // TODO: Move to TypingWeighting and GestureWeighting?
    static int getForwardInputCount(const CorrectionType correctionType);
};
} // namespace latinime
Loading