| Index: third_party/android_prediction/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_gc_event_listeners.h
|
| diff --git a/third_party/android_prediction/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_gc_event_listeners.h b/third_party/android_prediction/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_gc_event_listeners.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9012d9a36e69b50fac6f9e443df98fb446c2e89b
|
| --- /dev/null
|
| +++ b/third_party/android_prediction/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_gc_event_listeners.h
|
| @@ -0,0 +1,172 @@
|
| +/*
|
| + * Copyright (C) 2013, 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_DYNAMIC_PT_GC_EVENT_LISTENERS_H
|
| +#define LATINIME_DYNAMIC_PT_GC_EVENT_LISTENERS_H
|
| +
|
| +#include <vector>
|
| +
|
| +#include "third_party/android_prediction/defines.h"
|
| +#include "third_party/android_prediction/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_reading_helper.h"
|
| +#include "third_party/android_prediction/suggest/policyimpl/dictionary/structure/pt_common/pt_node_writer.h"
|
| +#include "third_party/android_prediction/suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h"
|
| +
|
| +namespace latinime {
|
| +
|
| +class PtNodeParams;
|
| +
|
| +class DynamicPtGcEventListeners {
|
| + public:
|
| + // Updates all PtNodes that can be reached from the root. Checks if each PtNode is useless or
|
| + // not and marks useless PtNodes as deleted. Such deleted PtNodes will be discarded in the GC.
|
| + // TODO: Concatenate non-terminal PtNodes.
|
| + class TraversePolicyToUpdateUnigramProbabilityAndMarkUselessPtNodesAsDeleted
|
| + : public DynamicPtReadingHelper::TraversingEventListener {
|
| + public:
|
| + TraversePolicyToUpdateUnigramProbabilityAndMarkUselessPtNodesAsDeleted(
|
| + PtNodeWriter *const ptNodeWriter)
|
| + : mPtNodeWriter(ptNodeWriter), mValueStack(), mChildrenValue(0),
|
| + mValidUnigramCount(0) {}
|
| +
|
| + ~TraversePolicyToUpdateUnigramProbabilityAndMarkUselessPtNodesAsDeleted() {};
|
| +
|
| + bool onAscend() {
|
| + if (mValueStack.empty()) {
|
| + return false;
|
| + }
|
| + mChildrenValue = mValueStack.back();
|
| + mValueStack.pop_back();
|
| + return true;
|
| + }
|
| +
|
| + bool onDescend(const int ptNodeArrayPos) {
|
| + mValueStack.push_back(0);
|
| + mChildrenValue = 0;
|
| + return true;
|
| + }
|
| +
|
| + bool onReadingPtNodeArrayTail() { return true; }
|
| +
|
| + bool onVisitingPtNode(const PtNodeParams *const ptNodeParams);
|
| +
|
| + int getValidUnigramCount() const {
|
| + return mValidUnigramCount;
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_IMPLICIT_CONSTRUCTORS(
|
| + TraversePolicyToUpdateUnigramProbabilityAndMarkUselessPtNodesAsDeleted);
|
| +
|
| + PtNodeWriter *const mPtNodeWriter;
|
| + std::vector<int> mValueStack;
|
| + int mChildrenValue;
|
| + int mValidUnigramCount;
|
| + };
|
| +
|
| + // Updates all bigram entries that are held by valid PtNodes. This removes useless bigram
|
| + // entries.
|
| + class TraversePolicyToUpdateBigramProbability
|
| + : public DynamicPtReadingHelper::TraversingEventListener {
|
| + public:
|
| + TraversePolicyToUpdateBigramProbability(PtNodeWriter *const ptNodeWriter)
|
| + : mPtNodeWriter(ptNodeWriter), mValidBigramEntryCount(0) {}
|
| +
|
| + bool onAscend() { return true; }
|
| +
|
| + bool onDescend(const int ptNodeArrayPos) { return true; }
|
| +
|
| + bool onReadingPtNodeArrayTail() { return true; }
|
| +
|
| + bool onVisitingPtNode(const PtNodeParams *const ptNodeParams);
|
| +
|
| + int getValidBigramEntryCount() const {
|
| + return mValidBigramEntryCount;
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_IMPLICIT_CONSTRUCTORS(TraversePolicyToUpdateBigramProbability);
|
| +
|
| + PtNodeWriter *const mPtNodeWriter;
|
| + int mValidBigramEntryCount;
|
| + };
|
| +
|
| + class TraversePolicyToPlaceAndWriteValidPtNodesToBuffer
|
| + : public DynamicPtReadingHelper::TraversingEventListener {
|
| + public:
|
| + TraversePolicyToPlaceAndWriteValidPtNodesToBuffer(
|
| + PtNodeWriter *const ptNodeWriter, BufferWithExtendableBuffer *const bufferToWrite,
|
| + PtNodeWriter::DictPositionRelocationMap *const dictPositionRelocationMap)
|
| + : mPtNodeWriter(ptNodeWriter), mBufferToWrite(bufferToWrite),
|
| + mDictPositionRelocationMap(dictPositionRelocationMap), mValidPtNodeCount(0),
|
| + mPtNodeArraySizeFieldPos(NOT_A_DICT_POS) {};
|
| +
|
| + bool onAscend() { return true; }
|
| +
|
| + bool onDescend(const int ptNodeArrayPos);
|
| +
|
| + bool onReadingPtNodeArrayTail();
|
| +
|
| + bool onVisitingPtNode(const PtNodeParams *const ptNodeParams);
|
| +
|
| + private:
|
| + DISALLOW_IMPLICIT_CONSTRUCTORS(TraversePolicyToPlaceAndWriteValidPtNodesToBuffer);
|
| +
|
| + PtNodeWriter *const mPtNodeWriter;
|
| + BufferWithExtendableBuffer *const mBufferToWrite;
|
| + PtNodeWriter::DictPositionRelocationMap *const mDictPositionRelocationMap;
|
| + int mValidPtNodeCount;
|
| + int mPtNodeArraySizeFieldPos;
|
| + };
|
| +
|
| + class TraversePolicyToUpdateAllPositionFields
|
| + : public DynamicPtReadingHelper::TraversingEventListener {
|
| + public:
|
| + TraversePolicyToUpdateAllPositionFields(PtNodeWriter *const ptNodeWriter,
|
| + const PtNodeWriter::DictPositionRelocationMap *const dictPositionRelocationMap)
|
| + : mPtNodeWriter(ptNodeWriter),
|
| + mDictPositionRelocationMap(dictPositionRelocationMap), mUnigramCount(0),
|
| + mBigramCount(0) {};
|
| +
|
| + bool onAscend() { return true; }
|
| +
|
| + bool onDescend(const int ptNodeArrayPos) { return true; }
|
| +
|
| + bool onReadingPtNodeArrayTail() { return true; }
|
| +
|
| + bool onVisitingPtNode(const PtNodeParams *const ptNodeParams);
|
| +
|
| + int getUnigramCount() const {
|
| + return mUnigramCount;
|
| + }
|
| +
|
| + int getBigramCount() const {
|
| + return mBigramCount;
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_IMPLICIT_CONSTRUCTORS(TraversePolicyToUpdateAllPositionFields);
|
| +
|
| + PtNodeWriter *const mPtNodeWriter;
|
| + const PtNodeWriter::DictPositionRelocationMap *const mDictPositionRelocationMap;
|
| + int mUnigramCount;
|
| + int mBigramCount;
|
| + };
|
| +
|
| + private:
|
| + DISALLOW_IMPLICIT_CONSTRUCTORS(DynamicPtGcEventListeners);
|
| +};
|
| +} // namespace latinime
|
| +#endif /* LATINIME_DYNAMIC_PT_GC_EVENT_LISTENERS_H */
|
|
|