138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka/*
238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * Copyright (C) 2012 The Android Open Source Project
338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka *
438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * Licensed under the Apache License, Version 2.0 (the "License");
538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * you may not use this file except in compliance with the License.
638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * You may obtain a copy of the License at
738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka *
838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka *      http://www.apache.org/licenses/LICENSE-2.0
938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka *
1038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * Unless required by applicable law or agreed to in writing, software
1138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * distributed under the License is distributed on an "AS IS" BASIS,
1238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * See the License for the specific language governing permissions and
1438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka * limitations under the License.
1538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka */
1638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
1738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka#ifndef LATINIME_DIC_NODE_STATE_INPUT_H
1838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka#define LATINIME_DIC_NODE_STATE_INPUT_H
1938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
2038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka#include "defines.h"
2138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
2238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataokanamespace latinime {
2338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
2438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka// TODO: Have a .cpp for this class
2538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataokaclass DicNodeStateInput {
2638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka public:
2738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    DicNodeStateInput() {}
28632c9aca5bbae49be278cf3e88d12b364fbd6fc8Keisuke Kuroyanagi    ~DicNodeStateInput() {}
2938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
3038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    void init() {
3138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        for (int i = 0; i < MAX_POINTER_COUNT_G; i++) {
3238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            // TODO: The initial value for mInputIndex should be -1?
3338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            //mInputIndex[i] = i == 0 ? 0 : -1;
3438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            mInputIndex[i] = 0;
3538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            mPrevCodePoint[i] = NOT_A_CODE_POINT;
3638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            mTerminalDiffCost[i] = static_cast<float>(MAX_VALUE_FOR_WEIGHTING);
3738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        }
3838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
3938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
4038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    void init(const DicNodeStateInput *const src, const bool resetTerminalDiffCost) {
4138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        for (int i = 0; i < MAX_POINTER_COUNT_G; i++) {
4238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka             mInputIndex[i] = src->mInputIndex[i];
4338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka             mPrevCodePoint[i] = src->mPrevCodePoint[i];
4460a169f0c34bf0da89c420d99bfff5c2556f3fbfKeisuke Kuroynagi             mTerminalDiffCost[i] = resetTerminalDiffCost ?
4560a169f0c34bf0da89c420d99bfff5c2556f3fbfKeisuke Kuroynagi                     static_cast<float>(MAX_VALUE_FOR_WEIGHTING) : src->mTerminalDiffCost[i];
4638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka         }
4738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
4838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
4938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    void updateInputIndexG(const int pointerId, const int inputIndex,
5038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            const int prevCodePoint, const float terminalDiffCost, const float rawLength) {
5138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        mInputIndex[pointerId] = inputIndex;
5238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        mPrevCodePoint[pointerId] = prevCodePoint;
5338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        mTerminalDiffCost[pointerId] = terminalDiffCost;
5438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
5538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
56eddbb7ac88c3174ffdc38a9dd799029302f55d03Keisuke Kuroyanagi    void initByCopy(const DicNodeStateInput *const src) {
5738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        init(src, false);
5838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
5938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
6038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    // For transposition
6138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    void setPrevCodePoint(const int pointerId, const int c) {
6238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        mPrevCodePoint[pointerId] = c;
6338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
6438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
6538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    void forwardInputIndex(const int pointerId, const int val) {
6638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        if (mInputIndex[pointerId] < 0) {
6738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            mInputIndex[pointerId] = val;
6838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        } else {
6938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka            mInputIndex[pointerId] = mInputIndex[pointerId] + val;
7038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        }
7138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
7238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
7338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    int getInputIndex(const int pointerId) const {
7438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        // when "inputIndex" exceeds "inputSize", auto-completion needs to be done
7538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        return mInputIndex[pointerId];
7638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
7738c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
7838c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    int getPrevCodePoint(const int pointerId) const {
7938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        return mPrevCodePoint[pointerId];
8038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
8138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
8238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    float getTerminalDiffCost(const int pointerId) const {
8338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka        return mTerminalDiffCost[pointerId];
8438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    }
8538c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka
8638c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka private:
87632c9aca5bbae49be278cf3e88d12b364fbd6fc8Keisuke Kuroyanagi    DISALLOW_COPY_AND_ASSIGN(DicNodeStateInput);
88632c9aca5bbae49be278cf3e88d12b364fbd6fc8Keisuke Kuroyanagi
8938c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    int mInputIndex[MAX_POINTER_COUNT_G];
9038c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    int mPrevCodePoint[MAX_POINTER_COUNT_G];
9138c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka    float mTerminalDiffCost[MAX_POINTER_COUNT_G];
9238c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka};
9338c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka} // namespace latinime
9438c26dd0bf8cd5c4511e4a02d5eeae4b3553f03aSatoshi Kataoka#endif // LATINIME_DIC_NODE_STATE_INPUT_H
95