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