1f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 2f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Licensed under the Apache License, Version 2.0 (the "License"); 3f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// you may not use this file except in compliance with the License. 4f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// You may obtain a copy of the License at 5f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 6f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// http://www.apache.org/licenses/LICENSE-2.0 7f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 8f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Unless required by applicable law or agreed to in writing, software 9f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// distributed under the License is distributed on an "AS IS" BASIS, 10f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// See the License for the specific language governing permissions and 12f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// limitations under the License. 13f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 14f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Copyright 2005-2010 Google, Inc. 15f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Author: jpr@google.com (Jake Ratkiewicz) 16f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 17f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// These classes are only recommended for use in high-level scripting 18f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// applications. Most users should use the lower-level templated versions 19f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// corresponding to these classes. 20f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 21f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/script/fst-class.h> 22f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/script/register.h> 23f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/fst-decl.h> 24f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/union.h> 25f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/reverse.h> 26f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/equal.h> 27f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 28f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace fst { 29f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace script { 30f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 31f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 32f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// REGISTRATION 33f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 34f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 35f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonREGISTER_FST_CLASSES(StdArc); 36f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonREGISTER_FST_CLASSES(LogArc); 37f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonREGISTER_FST_CLASSES(Log64Arc); 38f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 39f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 40f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// FST CLASS METHODS 41f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 42f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 43f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class FstT> 44f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonFstT *ReadFst(istream &in, const string &fname) { 45f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!in) { 46f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson LOG(ERROR) << "ReadFst: Can't open file: " << fname; 47f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return 0; 48f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 49f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 50f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson FstHeader hdr; 51f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!hdr.Read(in, fname)) { 52f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return 0; 53f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 54f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 55f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson FstReadOptions read_options(fname, &hdr); 56f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 57f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typename IORegistration<FstT>::Register *reg = 58f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson IORegistration<FstT>::Register::GetRegister(); 59f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 60f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const typename IORegistration<FstT>::Reader reader = 61f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson reg->GetReader(hdr.ArcType()); 62f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 63f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!reader) { 64f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson LOG(ERROR) << "ReadFst : unknown arc type \"" 65f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson << hdr.ArcType() << "\" : " << read_options.source; 66f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return 0; 67f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 68f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 69f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return reader(in, read_options); 70f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 71f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 72f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonFstClass *FstClass::Read(const string &fname) { 73f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!fname.empty()) { 74f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ifstream in(fname.c_str(), ifstream::in | ifstream::binary); 75f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return ReadFst<FstClass>(in, fname); 76f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } else { 77f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return ReadFst<FstClass>(std::cin, "standard input"); 78f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 79f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 80f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 81f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 82f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// MUTABLE FST CLASS METHODS 83f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 84f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 85f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonMutableFstClass *MutableFstClass::Read(const string &fname, bool convert) { 86f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (convert == false) { 87f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!fname.empty()) { 88f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ifstream in(fname.c_str(), ifstream::in | ifstream::binary); 89f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return ReadFst<MutableFstClass>(in, fname); 90f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } else { 91f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return ReadFst<MutableFstClass>(std::cin, "standard input"); 92f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 93f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } else { // Converts to VectorFstClass if not mutable. 94f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson FstClass *ifst = FstClass::Read(fname); 95f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!ifst) return 0; 96f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (ifst->Properties(fst::kMutable, false)) { 97f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return static_cast<MutableFstClass *>(ifst); 98f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } else { 99f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson MutableFstClass *ofst = new VectorFstClass(*ifst); 100f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson delete ifst; 101f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return ofst; 102f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 103f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 104f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 105f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 106f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 107f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// VECTOR FST CLASS METHODS 108f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 109f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 110f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonIORegistration<VectorFstClass>::Entry GetVFSTRegisterEntry( 111f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const string &arc_type) { 112f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson IORegistration<VectorFstClass>::Register *reg = 113f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson IORegistration<VectorFstClass>::Register::GetRegister(); 114f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const IORegistration<VectorFstClass>::Entry &entry = reg->GetEntry(arc_type); 115f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 116f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (entry.converter == 0) { 117f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson LOG(ERROR) << "Unknown arc type " << arc_type; 118f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return entry; 119f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 120f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 121f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return entry; 122f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 123f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 124f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonVectorFstClass::VectorFstClass(const FstClass &other) 125f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : MutableFstClass(GetVFSTRegisterEntry(other.ArcType()).converter(other)) { 126f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 127f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 128f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonVectorFstClass::VectorFstClass(const string &arc_type) 129f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : MutableFstClass(GetVFSTRegisterEntry(arc_type).creator()) { } 130f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 131f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonVectorFstClass *VectorFstClass::Read(const string &fname) { 132f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!fname.empty()) { 133f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ifstream in(fname.c_str(), ifstream::in | ifstream::binary); 134f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return ReadFst<VectorFstClass>(in, fname); 135f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } else { 136f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return ReadFst<VectorFstClass>(std::cin, "standard input"); 137f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 138f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 139f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 140f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} // namespace script 141f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} // namespace fst 142