14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// rational.h 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// An Fst implementation and base interface for delayed unions, 184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// concatenations and closures. 194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef FST_LIB_RATIONAL_H__ 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define FST_LIB_RATIONAL_H__ 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "fst/lib/map.h" 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "fst/lib/mutable-fst.h" 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "fst/lib/replace.h" 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "fst/lib/test-properties.h" 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectnamespace fst { 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttypedef CacheOptions RationalFstOptions; 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// This specifies whether to add the empty string. 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectenum ClosureType { CLOSURE_STAR = 0, // T* -> add the empty string 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLOSURE_PLUS = 1 }; // T+ -> don't add the empty string 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> class RationalFst; 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> void Union(RationalFst<A> *fst1, const Fst<A> &fst2); 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> void Concat(RationalFst<A> *fst1, const Fst<A> &fst2); 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> void Closure(RationalFst<A> *fst, ClosureType closure_type); 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Implementation class for delayed unions, concatenations and closures. 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate<class A> 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass RationalFstImpl : public ReplaceFstImpl<A> { 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project using FstImpl<A>::SetType; 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project using FstImpl<A>::SetProperties; 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project using FstImpl<A>::Properties; 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project using FstImpl<A>::SetInputSymbols; 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project using FstImpl<A>::SetOutputSymbols; 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project using ReplaceFstImpl<A>::SetRoot; 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename A::Weight Weight; 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename A::Label Label; 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project explicit RationalFstImpl(const RationalFstOptions &opts) 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : ReplaceFstImpl<A>(ReplaceFstOptions(opts, kNoLabel)), 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project nonterminals_(0) { 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetType("rational"); 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Implementation of UnionFst(fst1,fst2) 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void InitUnion(const Fst<A> &fst1, const Fst<A> &fst2) { 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project uint64 props1 = fst1.Properties(kFstProperties, false); 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project uint64 props2 = fst2.Properties(kFstProperties, false); 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetInputSymbols(fst1.InputSymbols()); 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetOutputSymbols(fst1.OutputSymbols()); 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.AddState(); 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.AddState(); 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.SetStart(0); 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.SetFinal(1, Weight::One()); 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.SetInputSymbols(fst1.InputSymbols()); 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.SetOutputSymbols(fst1.OutputSymbols()); 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project nonterminals_ = 2; 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.AddArc(0, A(0, -1, Weight::One(), 1)); 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.AddArc(0, A(0, -2, Weight::One(), 1)); 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project AddFst(0, &rfst_); 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project AddFst(-1, &fst1); 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project AddFst(-2, &fst2); 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetRoot(0); 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetProperties(UnionProperties(props1, props2, true), kCopyProperties); 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Implementation of ConcatFst(fst1,fst2) 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void InitConcat(const Fst<A> &fst1, const Fst<A> &fst2) { 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project uint64 props1 = fst1.Properties(kFstProperties, false); 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project uint64 props2 = fst2.Properties(kFstProperties, false); 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetInputSymbols(fst1.InputSymbols()); 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetOutputSymbols(fst1.OutputSymbols()); 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.AddState(); 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.AddState(); 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.AddState(); 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.SetStart(0); 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.SetFinal(2, Weight::One()); 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.SetInputSymbols(fst1.InputSymbols()); 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.SetOutputSymbols(fst1.OutputSymbols()); 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project nonterminals_ = 2; 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.AddArc(0, A(0, -1, Weight::One(), 1)); 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.AddArc(1, A(0, -2, Weight::One(), 2)); 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project AddFst(0, &rfst_); 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project AddFst(-1, &fst1); 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project AddFst(-2, &fst2); 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetRoot(0); 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetProperties(ConcatProperties(props1, props2, true), kCopyProperties); 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Implementation of ClosureFst(fst, closure_type) 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void InitClosure(const Fst<A> &fst, ClosureType closure_type) { 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project uint64 props = fst.Properties(kFstProperties, false); 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetInputSymbols(fst.InputSymbols()); 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetOutputSymbols(fst.OutputSymbols()); 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (closure_type == CLOSURE_STAR) { 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.AddState(); 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.SetStart(0); 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.SetFinal(0, Weight::One()); 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.AddArc(0, A(0, -1, Weight::One(), 0)); 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } else { 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.AddState(); 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.AddState(); 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.SetStart(0); 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.SetFinal(1, Weight::One()); 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.AddArc(0, A(0, -1, Weight::One(), 1)); 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.AddArc(1, A(0, 0, Weight::One(), 0)); 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.SetInputSymbols(fst.InputSymbols()); 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rfst_.SetOutputSymbols(fst.OutputSymbols()); 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project AddFst(0, &rfst_); 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project AddFst(-1, &fst); 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetRoot(0); 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project nonterminals_ = 1; 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetProperties(ClosureProperties(props, closure_type == CLOSURE_STAR, true), 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project kCopyProperties); 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Implementation of Union(Fst &, RationalFst *) 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void AddUnion(const Fst<A> &fst) { 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project uint64 props1 = Properties(); 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project uint64 props2 = fst.Properties(kFstProperties, false); 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project VectorFst<A> afst; 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project afst.AddState(); 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project afst.AddState(); 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project afst.SetStart(0); 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project afst.SetFinal(1, Weight::One()); 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project afst.AddArc(0, A(0, -nonterminals_, Weight::One(), 1)); 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Union(&rfst_, afst); 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetFst(0, &rfst_); 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ++nonterminals_; 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetProperties(UnionProperties(props1, props2, true), kCopyProperties); 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Implementation of Concat(Fst &, RationalFst *) 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void AddConcat(const Fst<A> &fst) { 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project uint64 props1 = Properties(); 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project uint64 props2 = fst.Properties(kFstProperties, false); 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project VectorFst<A> afst; 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project afst.AddState(); 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project afst.AddState(); 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project afst.SetStart(0); 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project afst.SetFinal(1, Weight::One()); 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project afst.AddArc(0, A(0, -nonterminals_, Weight::One(), 1)); 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Concat(&rfst_, afst); 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetFst(0, &rfst_); 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ++nonterminals_; 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetProperties(ConcatProperties(props1, props2, true), kCopyProperties); 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Implementation of Closure(RationalFst *, closure_type) 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void AddClosure(ClosureType closure_type) { 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project uint64 props = Properties(); 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Closure(&rfst_, closure_type); 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetFst(0, &rfst_); 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetProperties(ClosureProperties(props, closure_type == CLOSURE_STAR, true), 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project kCopyProperties); 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private: 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project VectorFst<A> rfst_; // rational topology machine; uses neg. nonterminals 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Label nonterminals_; // # of nonterminals used 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project DISALLOW_EVIL_CONSTRUCTORS(RationalFstImpl); 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Parent class for the delayed rational operations - delayed union, 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// concatenation, and closure. This class attaches interface to 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// implementation and handles reference counting. 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> 1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass RationalFst : public Fst<A> { 1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project friend class CacheStateIterator< RationalFst<A> >; 1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project friend class ArcIterator< RationalFst<A> >; 1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project friend class CacheArcIterator< RationalFst<A> >; 1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project friend void Union<>(RationalFst<A> *fst1, const Fst<A> &fst2); 1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project friend void Concat<>(RationalFst<A> *fst1, const Fst<A> &fst2); 1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project friend void Closure<>(RationalFst<A> *fst, ClosureType closure_type); 1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef A Arc; 1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename A::Weight Weight; 1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename A::StateId StateId; 1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef CacheState<A> State; 2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual StateId Start() const { return impl_->Start(); } 2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual Weight Final(StateId s) const { return impl_->Final(s); } 2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual size_t NumArcs(StateId s) const { return impl_->NumArcs(s); } 2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual size_t NumInputEpsilons(StateId s) const { 2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return impl_->NumInputEpsilons(s); 2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual size_t NumOutputEpsilons(StateId s) const { 2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return impl_->NumOutputEpsilons(s); 2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual uint64 Properties(uint64 mask, bool test) const { 2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (test) { 2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project uint64 known, test = TestProperties(*this, mask, &known); 2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl_->SetProperties(test, known); 2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return test & mask; 2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } else { 2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return impl_->Properties(mask); 2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual const string& Type() const { return impl_->Type(); } 2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual const SymbolTable* InputSymbols() const { 2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return impl_->InputSymbols(); 2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual const SymbolTable* OutputSymbols() const { 2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return impl_->OutputSymbols(); 2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual inline void InitStateIterator(StateIteratorData<A> *data) const; 2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual void InitArcIterator(StateId s, ArcIteratorData<A> *data) const { 2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl_->InitArcIterator(s, data); 2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project protected: 2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RationalFst() : impl_(new RationalFstImpl<A>(RationalFstOptions())) {} 2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project explicit RationalFst(const RationalFstOptions &opts) 2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : impl_(new RationalFstImpl<A>(opts)) {} 2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RationalFst(const RationalFst<A> &fst) : impl_(fst.impl_) { 2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl_->IncrRefCount(); 2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual ~RationalFst() { if (!impl_->DecrRefCount()) delete impl_; } 2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RationalFstImpl<A> *Impl() { return impl_; } 2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private: 2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RationalFstImpl<A> *impl_; 2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void operator=(const RationalFst<A> &fst); // disallow 2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Specialization for RationalFst. 2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> 2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass StateIterator< RationalFst<A> > 2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : public CacheStateIterator< RationalFst<A> > { 2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project explicit StateIterator(const RationalFst<A> &fst) 2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : CacheStateIterator< RationalFst<A> >(fst) {} 2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Specialization for RationalFst. 2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> 2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass ArcIterator< RationalFst<A> > 2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : public CacheArcIterator< RationalFst<A> > { 2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename A::StateId StateId; 2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ArcIterator(const RationalFst<A> &fst, StateId s) 2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : CacheArcIterator< RationalFst<A> >(fst, s) { 2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!fst.impl_->HasArcs(s)) 2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fst.impl_->Expand(s); 2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private: 2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project DISALLOW_EVIL_CONSTRUCTORS(ArcIterator); 2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> inline 2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid RationalFst<A>::InitStateIterator(StateIteratorData<A> *data) const { 2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data->base = new StateIterator< RationalFst<A> >(*this); 2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} // namespace fst 2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif // FST_LIB_RATIONAL_H__ 287