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

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

Merge "Add a method to iterate ngram entries." into lmp-dev

parents f4a3fd48 2d57b333
Loading
Loading
Loading
Loading
+30 −22
Original line number Diff line number Diff line
@@ -59,32 +59,40 @@ void Dictionary::getSuggestions(ProximityInfo *proximityInfo, DicTraverseSession
    }
}

void Dictionary::getPredictions(const PrevWordsInfo *const prevWordsInfo,
        SuggestionResults *const outSuggestionResults) const {
    TimeKeeper::setCurrentTime();
Dictionary::NgramListenerForPrediction::NgramListenerForPrediction(
        const PrevWordsInfo *const prevWordsInfo, SuggestionResults *const suggestionResults,
        const DictionaryStructureWithBufferPolicy *const dictStructurePolicy)
    : mPrevWordsInfo(prevWordsInfo), mSuggestionResults(suggestionResults),
      mDictStructurePolicy(dictStructurePolicy) {}

void Dictionary::NgramListenerForPrediction::onVisitEntry(const int ngramProbability,
        const int targetPtNodePos) {
    if (targetPtNodePos == NOT_A_DICT_POS) {
        return;
    }
    if (mPrevWordsInfo->isNthPrevWordBeginningOfSentence(1 /* n */)
            && ngramProbability == NOT_A_PROBABILITY) {
        return;
    }
    int targetWordCodePoints[MAX_WORD_LENGTH];
    int unigramProbability = 0;
    int bigramCodePoints[MAX_WORD_LENGTH];
    BinaryDictionaryBigramsIterator bigramsIt = prevWordsInfo->getBigramsIteratorForPrediction(
            mDictionaryStructureWithBufferPolicy.get());
    while (bigramsIt.hasNext()) {
        bigramsIt.next();
        if (bigramsIt.getBigramPos() == NOT_A_DICT_POS) {
            continue;
        }
        if (prevWordsInfo->isNthPrevWordBeginningOfSentence(1 /* n */)
                && bigramsIt.getProbability() == NOT_A_PROBABILITY) {
            continue;
        }
        const int codePointCount = mDictionaryStructureWithBufferPolicy->
                getCodePointsAndProbabilityAndReturnCodePointCount(bigramsIt.getBigramPos(),
                        MAX_WORD_LENGTH, bigramCodePoints, &unigramProbability);
    const int codePointCount = mDictStructurePolicy->
            getCodePointsAndProbabilityAndReturnCodePointCount(targetPtNodePos,
                    MAX_WORD_LENGTH, targetWordCodePoints, &unigramProbability);
    if (codePointCount <= 0) {
            continue;
        return;
    }
        const int probability = mDictionaryStructureWithBufferPolicy->getProbability(
                unigramProbability, bigramsIt.getProbability());
        outSuggestionResults->addPrediction(bigramCodePoints, codePointCount, probability);
    const int probability = mDictStructurePolicy->getProbability(
            unigramProbability, ngramProbability);
    mSuggestionResults->addPrediction(targetWordCodePoints, codePointCount, probability);
}

void Dictionary::getPredictions(const PrevWordsInfo *const prevWordsInfo,
        SuggestionResults *const outSuggestionResults) const {
    TimeKeeper::setCurrentTime();
    NgramListenerForPrediction listener(prevWordsInfo, outSuggestionResults,
            mDictionaryStructureWithBufferPolicy.get());
    mDictionaryStructureWithBufferPolicy->iterateNgramEntries(prevWordsInfo, &listener);
}

int Dictionary::getProbability(const int *word, int length) const {
+16 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@

#include "defines.h"
#include "jni.h"
#include "suggest/core/dictionary/ngram_listener.h"
#include "suggest/core/dictionary/property/word_property.h"
#include "suggest/core/policy/dictionary_header_structure_policy.h"
#include "suggest/core/policy/dictionary_structure_with_buffer_policy.h"
@@ -114,6 +115,21 @@ class Dictionary {

    typedef std::unique_ptr<SuggestInterface> SuggestInterfacePtr;

    class NgramListenerForPrediction : public NgramListener {
     public:
        NgramListenerForPrediction(const PrevWordsInfo *const prevWordsInfo,
                SuggestionResults *const suggestionResults,
                const DictionaryStructureWithBufferPolicy *const dictStructurePolicy);
        virtual void onVisitEntry(const int ngramProbability, const int targetPtNodePos);

     private:
        DISALLOW_IMPLICIT_CONSTRUCTORS(NgramListenerForPrediction);

        const PrevWordsInfo *const mPrevWordsInfo;
        SuggestionResults *const mSuggestionResults;
        const DictionaryStructureWithBufferPolicy *const mDictStructurePolicy;
    };

    static const int HEADER_ATTRIBUTE_BUFFER_SIZE;

    const DictionaryStructureWithBufferPolicy::StructurePolicyPtr
+40 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef LATINIME_NGRAM_LISTENER_H
#define LATINIME_NGRAM_LISTENER_H

#include "defines.h"

namespace latinime {

/**
 * Interface to iterate ngram entries.
 */
class NgramListener {
 public:
    virtual void onVisitEntry(const int ngramProbability, const int targetPtNodePos) = 0;
    virtual ~NgramListener() {};

 protected:
    NgramListener() {}

 private:
    DISALLOW_COPY_AND_ASSIGN(NgramListener);

};
} // namespace latinime
#endif /* LATINIME_NGRAM_LISTENER_H */
+4 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ class DicNodeVector;
class DictionaryBigramsStructurePolicy;
class DictionaryHeaderStructurePolicy;
class DictionaryShortcutsStructurePolicy;
class NgramListener;
class PrevWordsInfo;
class UnigramProperty;

@@ -61,6 +62,9 @@ class DictionaryStructureWithBufferPolicy {
    virtual int getProbabilityOfPtNode(const PrevWordsInfo *const prevWordsInfo,
            const int nodePos) const = 0;

    virtual void iterateNgramEntries(const PrevWordsInfo *const prevWordsInfo,
            NgramListener *const listener) const = 0;

    virtual int getShortcutPositionOfPtNode(const int nodePos) const = 0;

    virtual BinaryDictionaryBigramsIterator getBigramsIteratorOfPtNode(const int nodePos) const = 0;
+11 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@

#include "suggest/core/dicnode/dic_node.h"
#include "suggest/core/dicnode/dic_node_vector.h"
#include "suggest/core/dictionary/ngram_listener.h"
#include "suggest/core/dictionary/property/bigram_property.h"
#include "suggest/core/dictionary/property/unigram_property.h"
#include "suggest/core/dictionary/property/word_property.h"
@@ -155,6 +156,16 @@ int Ver4PatriciaTriePolicy::getProbabilityOfPtNode(const PrevWordsInfo *const pr
    return getProbability(ptNodeParams.getProbability(), NOT_A_PROBABILITY);
}

void Ver4PatriciaTriePolicy::iterateNgramEntries(const PrevWordsInfo *const prevWordsInfo,
        NgramListener *const listener) const {
    BinaryDictionaryBigramsIterator bigramsIt = prevWordsInfo->getBigramsIteratorForPrediction(
            this /* dictStructurePolicy */);
    while (bigramsIt.hasNext()) {
        bigramsIt.next();
        listener->onVisitEntry(bigramsIt.getProbability(), bigramsIt.getBigramPos());
    }
}

int Ver4PatriciaTriePolicy::getShortcutPositionOfPtNode(const int ptNodePos) const {
    if (ptNodePos == NOT_A_DICT_POS) {
        return NOT_A_DICT_POS;
Loading