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