dic_node_profiler.h revision 38c26dd0bf8cd5c4511e4a02d5eeae4b3553f03a
1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef LATINIME_DIC_NODE_PROFILER_H
18#define LATINIME_DIC_NODE_PROFILER_H
19
20#include "defines.h"
21
22#if DEBUG_DICT
23#define PROF_SPACE_SUBSTITUTION(profiler) profiler.profSpaceSubstitution()
24#define PROF_SPACE_OMISSION(profiler) profiler.profSpaceOmission()
25#define PROF_ADDITIONAL_PROXIMITY(profiler) profiler.profAdditionalProximity()
26#define PROF_SUBSTITUTION(profiler) profiler.profSubstitution()
27#define PROF_OMISSION(profiler) profiler.profOmission()
28#define PROF_INSERTION(profiler) profiler.profInsertion()
29#define PROF_MATCH(profiler) profiler.profMatch()
30#define PROF_COMPLETION(profiler) profiler.profCompletion()
31#define PROF_TRANSPOSITION(profiler) profiler.profTransposition()
32#define PROF_NEARESTKEY(profiler) profiler.profNearestKey()
33#define PROF_TERMINAL(profiler) profiler.profTerminal()
34#define PROF_NEW_WORD(profiler) profiler.profNewWord()
35#define PROF_NEW_WORD_BIGRAM(profiler) profiler.profNewWordBigram()
36#define PROF_NODE_RESET(profiler) profiler.reset()
37#define PROF_NODE_COPY(src, dest) dest.copy(src)
38#else
39#define PROF_SPACE_SUBSTITUTION(profiler)
40#define PROF_SPACE_OMISSION(profiler)
41#define PROF_ADDITONAL_PROXIMITY(profiler)
42#define PROF_SUBSTITUTION(profiler)
43#define PROF_OMISSION(profiler)
44#define PROF_INSERTION(profiler)
45#define PROF_MATCH(profiler)
46#define PROF_COMPLETION(profiler)
47#define PROF_TRANSPOSITION(profiler)
48#define PROF_NEARESTKEY(profiler)
49#define PROF_TERMINAL(profiler)
50#define PROF_NEW_WORD(profiler)
51#define PROF_NEW_WORD_BIGRAM(profiler)
52#define PROF_NODE_RESET(profiler)
53#define PROF_NODE_COPY(src, dest)
54#endif
55
56namespace latinime {
57
58class DicNodeProfiler {
59 public:
60#if DEBUG_DICT
61    AK_FORCE_INLINE DicNodeProfiler()
62            : mProfOmission(0), mProfInsertion(0), mProfTransposition(0),
63              mProfAdditionalProximity(0), mProfSubstitution(0),
64              mProfSpaceSubstitution(0), mProfSpaceOmission(0),
65              mProfMatch(0), mProfCompletion(0), mProfTerminal(0),
66              mProfNearestKey(0), mProfNewWord(0), mProfNewWordBigram(0) {}
67
68    int mProfOmission;
69    int mProfInsertion;
70    int mProfTransposition;
71    int mProfAdditionalProximity;
72    int mProfSubstitution;
73    int mProfSpaceSubstitution;
74    int mProfSpaceOmission;
75    int mProfMatch;
76    int mProfCompletion;
77    int mProfTerminal;
78    int mProfNearestKey;
79    int mProfNewWord;
80    int mProfNewWordBigram;
81
82    void profSpaceSubstitution() {
83        ++mProfSpaceSubstitution;
84    }
85
86    void profSpaceOmission() {
87        ++mProfSpaceOmission;
88    }
89
90    void profAdditionalProximity() {
91        ++mProfAdditionalProximity;
92    }
93
94    void profSubstitution() {
95        ++mProfSubstitution;
96    }
97
98    void profOmission() {
99        ++mProfOmission;
100    }
101
102    void profInsertion() {
103        ++mProfInsertion;
104    }
105
106    void profMatch() {
107        ++mProfMatch;
108    }
109
110    void profCompletion() {
111        ++mProfCompletion;
112    }
113
114    void profTransposition() {
115        ++mProfTransposition;
116    }
117
118    void profNearestKey() {
119        ++mProfNearestKey;
120    }
121
122    void profTerminal() {
123        ++mProfTerminal;
124    }
125
126    void profNewWord() {
127        ++mProfNewWord;
128    }
129
130    void profNewWordBigram() {
131        ++mProfNewWordBigram;
132    }
133
134    void reset() {
135        mProfSpaceSubstitution = 0;
136        mProfSpaceOmission = 0;
137        mProfAdditionalProximity = 0;
138        mProfSubstitution = 0;
139        mProfOmission = 0;
140        mProfInsertion = 0;
141        mProfMatch = 0;
142        mProfCompletion = 0;
143        mProfTransposition = 0;
144        mProfNearestKey = 0;
145        mProfTerminal = 0;
146        mProfNewWord = 0;
147        mProfNewWordBigram = 0;
148    }
149
150    void copy(const DicNodeProfiler *const profiler) {
151        mProfSpaceSubstitution = profiler->mProfSpaceSubstitution;
152        mProfSpaceOmission = profiler->mProfSpaceOmission;
153        mProfAdditionalProximity = profiler->mProfAdditionalProximity;
154        mProfSubstitution = profiler->mProfSubstitution;
155        mProfOmission = profiler->mProfOmission;
156        mProfInsertion = profiler->mProfInsertion;
157        mProfMatch = profiler->mProfMatch;
158        mProfCompletion = profiler->mProfCompletion;
159        mProfTransposition = profiler->mProfTransposition;
160        mProfNearestKey = profiler->mProfNearestKey;
161        mProfTerminal = profiler->mProfTerminal;
162        mProfNewWord = profiler->mProfNewWord;
163        mProfNewWordBigram = profiler->mProfNewWordBigram;
164    }
165
166    void dump() const {
167        AKLOGI("O %d, I %d, T %d, AP %d, S %d, SS %d, SO %d, M %d, C %d, TE %d, NW = %d, NWB = %d",
168                mProfOmission, mProfInsertion, mProfTransposition, mProfAdditionalProximity,
169                mProfSubstitution, mProfSpaceSubstitution, mProfSpaceOmission, mProfMatch,
170                mProfCompletion, mProfTerminal, mProfNewWord, mProfNewWordBigram);
171    }
172#else
173    DicNodeProfiler() {}
174#endif
175 private:
176    // Caution!!!
177    // Use a default copy constructor and an assign operator because shallow copies are ok
178    // for this class
179};
180}
181#endif // LATINIME_DIC_NODE_PROFILER_H
182