1
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 //
14 // Copyright 2005-2010 Google, Inc.
15 // Author: allauzen@google.com (Cyril Allauzen)
16 // Modified: jpr@google.com (Jake Ratkiewicz)
17
18 #ifndef FST_EXTENSIONS_FAR_INFO_H_
19 #define FST_EXTENSIONS_FAR_INFO_H_
20
21 #include <iomanip>
22 #include <set>
23 #include <string>
24 #include <vector>
25 using std::vector;
26
27 #include <fst/extensions/far/far.h>
28 #include <fst/extensions/far/main.h> // For FarTypeToString
29
30 namespace fst {
31
32 template <class Arc>
CountStatesAndArcs(const Fst<Arc> & fst,size_t * nstate,size_t * narc)33 void CountStatesAndArcs(const Fst<Arc> &fst, size_t *nstate, size_t *narc) {
34 StateIterator<Fst<Arc> > siter(fst);
35 for (; !siter.Done(); siter.Next(), ++(*nstate)) {
36 ArcIterator<Fst<Arc> > aiter(fst, siter.Value());
37 for (; !aiter.Done(); aiter.Next(), ++(*narc));
38 }
39 }
40
41 struct KeyInfo {
42 string key;
43 string type;
44 size_t nstate;
45 size_t narc;
46
47 KeyInfo(string k, string t, int64 ns = 0, int64 na = 0)
keyKeyInfo48 : key(k), type(t), nstate(ns), narc(na) {}
49 };
50
51 template <class Arc>
FarInfo(const vector<string> & filenames,const string & begin_key,const string & end_key,const bool list_fsts)52 void FarInfo(const vector<string> &filenames, const string &begin_key,
53 const string &end_key, const bool list_fsts) {
54 FarReader<Arc> *far_reader = FarReader<Arc>::Open(filenames);
55 if (!far_reader) return;
56
57 if (!begin_key.empty())
58 far_reader->Find(begin_key);
59
60 vector<KeyInfo> *infos = list_fsts ? new vector<KeyInfo>() : 0;
61 size_t nfst = 0, nstate = 0, narc = 0;
62 set<string> fst_types;
63 for (; !far_reader->Done(); far_reader->Next()) {
64 string key = far_reader->GetKey();
65 if (!end_key.empty() && end_key < key)
66 break;
67 ++nfst;
68 const Fst<Arc> &fst = far_reader->GetFst();
69 fst_types.insert(fst.Type());
70 if (infos) {
71 KeyInfo info(key, fst.Type());
72 CountStatesAndArcs(fst, &info.nstate, &info.narc);
73 nstate += info.nstate;
74 nstate += info.narc;
75 infos->push_back(info);
76 } else {
77 CountStatesAndArcs(fst, &nstate, &narc);
78 }
79 }
80
81 if (!infos) {
82 cout << std::left << setw(50) << "far type"
83 << FarTypeToString(far_reader->Type()) << endl;
84 cout << std::left << setw(50) << "arc type" << Arc::Type() << endl;
85 cout << std::left << setw(50) << "fst type";
86 for (set<string>::const_iterator iter = fst_types.begin();
87 iter != fst_types.end();
88 ++iter) {
89 if (iter != fst_types.begin())
90 cout << ",";
91 cout << *iter;
92 }
93 cout << endl;
94 cout << std::left << setw(50) << "# of FSTs" << nfst << endl;
95 cout << std::left << setw(50) << "total # of states" << nstate << endl;
96 cout << std::left << setw(50) << "total # of arcs" << narc << endl;
97
98 } else {
99 int wkey = 10, wtype = 10, wnstate = 16, wnarc = 16;
100 for (size_t i = 0; i < infos->size(); ++i) {
101 const KeyInfo &info = (*infos)[i];
102 if (info.key.size() + 2 > wkey)
103 wkey = info.key.size() + 2;
104 if (info.type.size() + 2 > wtype)
105 wtype = info.type.size() + 2;
106 if (ceil(log10(info.nstate)) + 2 > wnstate)
107 wnstate = ceil(log10(info.nstate)) + 2;
108 if (ceil(log10(info.narc)) + 2 > wnarc)
109 wnarc = ceil(log10(info.narc)) + 2;
110 }
111
112 cout << std::left << setw(wkey) << "key" << setw(wtype) << "type"
113 << std::right << setw(wnstate) << "# of states"
114 << setw(wnarc) << "# of arcs" << endl;
115
116 for (size_t i = 0; i < infos->size(); ++i) {
117 const KeyInfo &info = (*infos)[i];
118 cout << std::left << setw(wkey) << info.key << setw(wtype) << info.type
119 << std::right << setw(wnstate) << info.nstate
120 << setw(wnarc) << info.narc << endl;
121 }
122 }
123 }
124
125 } // namespace fst
126
127
128 #endif // FST_EXTENSIONS_FAR_INFO_H_
129