1 // fst.cc
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 //
16 // \file
17 // FST definitions.
18
19 #include "fst/lib/fst.h"
20
21 // Include these so they are registered
22 #include "fst/lib/const-fst.h"
23 #include "fst/lib/vector-fst.h"
24
25 // FST flag definitions
26
27 DEFINE_bool(fst_verify_properties, false,
28 "Verify fst properties queried by TestProperties");
29
30 DEFINE_string(fst_product_separator, ",",
31 "Character separator between printed weights"
32 " in a product semiring");
33
34 DEFINE_bool(fst_default_cache_gc, true, "Enable garbage collection of cache");
35
36 DEFINE_int64(fst_default_cache_gc_limit, 1<<20LL,
37 "Cache byte size that triggers garbage collection");
38
39 namespace fst {
40
41 // Register VectorFst and ConstFst for common arcs types
42
43 REGISTER_FST(VectorFst, StdArc);
44 REGISTER_FST(VectorFst, LogArc);
45 REGISTER_FST(ConstFst, StdArc);
46 REGISTER_FST(ConstFst, LogArc);
47
48 // Identifies stream data as an FST (and its endianity)
49 static const int32 kFstMagicNumber = 2125659606;
50
51 // Check Fst magic number and read in Fst header.
Read(istream & strm,const string & source)52 bool FstHeader::Read(istream &strm, const string &source) {
53 int32 magic_number = 0;
54 ReadType(strm, &magic_number);
55 if (magic_number != kFstMagicNumber) {
56 LOG(ERROR) << "FstHeader::Read: Bad FST header: " << source;
57 return false;
58 }
59
60 ReadType(strm, &fsttype_);
61 ReadType(strm, &arctype_);
62 ReadType(strm, &version_);
63 ReadType(strm, &flags_);
64 ReadType(strm, &properties_);
65 ReadType(strm, &start_);
66 ReadType(strm, &numstates_);
67 ReadType(strm, &numarcs_);
68 if (!strm)
69 LOG(ERROR) << "FstHeader::Read: read failed: " << source;
70 return strm;
71 }
72
73 // Write Fst magic number and Fst header.
Write(ostream & strm,const string & source) const74 bool FstHeader::Write(ostream &strm, const string &source) const {
75 WriteType(strm, kFstMagicNumber);
76 WriteType(strm, fsttype_);
77 WriteType(strm, arctype_);
78 WriteType(strm, version_);
79 WriteType(strm, flags_);
80 WriteType(strm, properties_);
81 WriteType(strm, start_);
82 WriteType(strm, numstates_);
83 WriteType(strm, numarcs_);
84 if (!strm)
85 LOG(ERROR) << "FstHeader::Write: write failed: " << source;
86 return strm;
87 }
88
89 }
90