14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// fst.cc
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Licensed under the Apache License, Version 2.0 (the "License");
44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// you may not use this file except in compliance with the License.
54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// You may obtain a copy of the License at
64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//      http://www.apache.org/licenses/LICENSE-2.0
84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Unless required by applicable law or agreed to in writing, software
104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// distributed under the License is distributed on an "AS IS" BASIS,
114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// See the License for the specific language governing permissions and
134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// limitations under the License.
144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// \file
174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// FST definitions.
184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "fst/lib/fst.h"
204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Include these so they are registered
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "fst/lib/const-fst.h"
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "fst/lib/vector-fst.h"
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// FST flag definitions
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectDEFINE_bool(fst_verify_properties, false,
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            "Verify fst properties queried by TestProperties");
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectDEFINE_string(fst_product_separator, ",",
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              "Character separator between printed weights"
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              " in a product semiring");
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectDEFINE_bool(fst_default_cache_gc, true, "Enable garbage collection of cache");
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectDEFINE_int64(fst_default_cache_gc_limit, 1<<20LL,
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project             "Cache byte size that triggers garbage collection");
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectnamespace fst {
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Register VectorFst and ConstFst for common arcs types
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectREGISTER_FST(VectorFst, StdArc);
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectREGISTER_FST(VectorFst, LogArc);
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectREGISTER_FST(ConstFst, StdArc);
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectREGISTER_FST(ConstFst, LogArc);
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Identifies stream data as an FST (and its endianity)
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic const int32 kFstMagicNumber = 2125659606;
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Check Fst magic number and read in Fst header.
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool FstHeader::Read(istream &strm, const string &source) {
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int32 magic_number = 0;
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ReadType(strm, &magic_number);
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (magic_number != kFstMagicNumber) {
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LOG(ERROR) << "FstHeader::Read: Bad FST header: " << source;
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return false;
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ReadType(strm, &fsttype_);
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ReadType(strm, &arctype_);
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ReadType(strm, &version_);
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ReadType(strm, &flags_);
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ReadType(strm, &properties_);
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ReadType(strm, &start_);
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ReadType(strm, &numstates_);
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ReadType(strm, &numarcs_);
6831124d583cfcd1ea9407856747c178d0125c1070Ian Rogers  if (!strm) {
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LOG(ERROR) << "FstHeader::Read: read failed: " << source;
7031124d583cfcd1ea9407856747c178d0125c1070Ian Rogers    return false;
7131124d583cfcd1ea9407856747c178d0125c1070Ian Rogers  }
7231124d583cfcd1ea9407856747c178d0125c1070Ian Rogers  return true;
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Write Fst magic number and Fst header.
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool FstHeader::Write(ostream &strm, const string &source) const {
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  WriteType(strm, kFstMagicNumber);
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  WriteType(strm, fsttype_);
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  WriteType(strm, arctype_);
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  WriteType(strm, version_);
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  WriteType(strm, flags_);
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  WriteType(strm, properties_);
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  WriteType(strm, start_);
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  WriteType(strm, numstates_);
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  WriteType(strm, numarcs_);
8631124d583cfcd1ea9407856747c178d0125c1070Ian Rogers  if (!strm) {
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LOG(ERROR) << "FstHeader::Write: write failed: " << source;
8831124d583cfcd1ea9407856747c178d0125c1070Ian Rogers    return false;
8931124d583cfcd1ea9407856747c178d0125c1070Ian Rogers  }
9031124d583cfcd1ea9407856747c178d0125c1070Ian Rogers  return true;
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
94