14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// factor-weight.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// Author: allauzen@cs.nyu.edu (Cyril Allauzen) 164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// \file 184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Classes to factor weights in an FST. 194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef FST_LIB_FACTOR_WEIGHT_H__ 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define FST_LIB_FACTOR_WEIGHT_H__ 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <algorithm> 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <ext/hash_map> 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectusing __gnu_cxx::hash_map; 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <ext/slist> 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectusing __gnu_cxx::slist; 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "fst/lib/cache.h" 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "fst/lib/test-properties.h" 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectnamespace fst { 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstruct FactorWeightOptions : CacheOptions { 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project float delta; 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool final_only; // only factor final weights when true 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FactorWeightOptions(const CacheOptions &opts, float d, bool of) 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : CacheOptions(opts), delta(d), final_only(of) {} 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project explicit FactorWeightOptions(float d, bool of = false) 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : delta(d), final_only(of) {} 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FactorWeightOptions(bool of = false) 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : delta(kDelta), final_only(of) {} 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// A factor iterator takes as argument a weight w and returns a 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// sequence of pairs of weights (xi,yi) such that the sum of the 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// products xi times yi is equal to w. If w is fully factored, 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// the iterator should return nothing. 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// template <class W> 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// class FactorIterator { 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// public: 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// FactorIterator(W w); 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// bool Done() const; 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// void Next(); 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// pair<W, W> Value() const; 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// void Reset(); 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// } 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Factor trivially. 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class W> 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass IdentityFactor { 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project IdentityFactor(const W &w) {} 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool Done() const { return true; } 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void Next() {} 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pair<W, W> Value() const { return make_pair(W::One(), W::One()); } // unused 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void Reset() {} 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Factor a StringWeight w as 'ab' where 'a' is a label. 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <typename L, StringType S = STRING_LEFT> 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass StringFactor { 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project StringFactor(const StringWeight<L, S> &w) 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : weight_(w), done_(w.Size() <= 1) {} 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool Done() const { return done_; } 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void Next() { done_ = true; } 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pair< StringWeight<L, S>, StringWeight<L, S> > Value() const { 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project StringWeightIterator<L, S> iter(weight_); 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project StringWeight<L, S> w1(iter.Value()); 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project StringWeight<L, S> w2; 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (iter.Next(); !iter.Done(); iter.Next()) 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project w2.PushBack(iter.Value()); 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return make_pair(w1, w2); 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void Reset() { done_ = weight_.Size() <= 1; } 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private: 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project StringWeight<L, S> weight_; 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool done_; 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Factor a GallicWeight using StringFactor. 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class L, class W, StringType S = STRING_LEFT> 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass GallicFactor { 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project GallicFactor(const GallicWeight<L, W, S> &w) 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : weight_(w), done_(w.Value1().Size() <= 1) {} 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool Done() const { return done_; } 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void Next() { done_ = true; } 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pair< GallicWeight<L, W, S>, GallicWeight<L, W, S> > Value() const { 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project StringFactor<L, S> iter(weight_.Value1()); 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project GallicWeight<L, W, S> w1(iter.Value().first, weight_.Value2()); 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project GallicWeight<L, W, S> w2(iter.Value().second, W::One()); 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return make_pair(w1, w2); 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void Reset() { done_ = weight_.Value1().Size() <= 1; } 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private: 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project GallicWeight<L, W, S> weight_; 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool done_; 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Implementation class for FactorWeight 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A, class F> 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass FactorWeightFstImpl 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : public CacheImpl<A> { 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project using FstImpl<A>::SetType; 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project using FstImpl<A>::SetProperties; 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project using FstImpl<A>::Properties; 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project using FstImpl<A>::SetInputSymbols; 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project using FstImpl<A>::SetOutputSymbols; 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project using CacheBaseImpl< CacheState<A> >::HasStart; 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project using CacheBaseImpl< CacheState<A> >::HasFinal; 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project using CacheBaseImpl< CacheState<A> >::HasArcs; 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef A Arc; 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename A::Label Label; 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename A::Weight Weight; 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename A::StateId StateId; 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef F FactorIterator; 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project struct Element { 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Element() {} 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Element(StateId s, Weight w) : state(s), weight(w) {} 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project StateId state; // Input state Id 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Weight weight; // Residual weight 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project }; 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FactorWeightFstImpl(const Fst<A> &fst, const FactorWeightOptions &opts) 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : CacheImpl<A>(opts), fst_(fst.Copy()), delta_(opts.delta), 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project final_only_(opts.final_only) { 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetType("factor-weight"); 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project uint64 props = fst.Properties(kFstProperties, false); 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetProperties(FactorWeightProperties(props), kCopyProperties); 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetInputSymbols(fst.InputSymbols()); 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetOutputSymbols(fst.OutputSymbols()); 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ~FactorWeightFstImpl() { 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete fst_; 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project StateId Start() { 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!HasStart()) { 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project StateId s = fst_->Start(); 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (s == kNoStateId) 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return kNoStateId; 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project StateId start = FindState(Element(fst_->Start(), Weight::One())); 183ea4ad6085a8661b5513c394316108c0ef26f3e7bAl Sutton this->SetStart(start); 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return CacheImpl<A>::Start(); 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Weight Final(StateId s) { 1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!HasFinal(s)) { 1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const Element &e = elements_[s]; 1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // TODO: fix so cast is unnecessary 1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Weight w = e.state == kNoStateId 1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ? e.weight 1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : (Weight) Times(e.weight, fst_->Final(e.state)); 1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FactorIterator f(w); 1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (w != Weight::Zero() && f.Done()) 197ea4ad6085a8661b5513c394316108c0ef26f3e7bAl Sutton this->SetFinal(s, w); 1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 199ea4ad6085a8661b5513c394316108c0ef26f3e7bAl Sutton this->SetFinal(s, Weight::Zero()); 2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return CacheImpl<A>::Final(s); 2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t NumArcs(StateId s) { 2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!HasArcs(s)) 2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Expand(s); 2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return CacheImpl<A>::NumArcs(s); 2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t NumInputEpsilons(StateId s) { 2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!HasArcs(s)) 2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Expand(s); 2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return CacheImpl<A>::NumInputEpsilons(s); 2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t NumOutputEpsilons(StateId s) { 2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!HasArcs(s)) 2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Expand(s); 2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return CacheImpl<A>::NumOutputEpsilons(s); 2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void InitArcIterator(StateId s, ArcIteratorData<A> *data) { 2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!HasArcs(s)) 2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Expand(s); 2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CacheImpl<A>::InitArcIterator(s, data); 2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Find state corresponding to an element. Create new state 2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // if element not found. 2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project StateId FindState(const Element &e) { 2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (final_only_ && e.weight == Weight::One()) { 2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (unfactored_.size() <= (unsigned int)e.state) 2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unfactored_.push_back(kNoStateId); 2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (unfactored_[e.state] == kNoStateId) { 2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unfactored_[e.state] = elements_.size(); 2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project elements_.push_back(e); 2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return unfactored_[e.state]; 2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } else { 2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typename ElementMap::iterator eit = element_map_.find(e); 2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (eit != element_map_.end()) { 2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (*eit).second; 2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } else { 2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project StateId s = elements_.size(); 2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project elements_.push_back(e); 2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project element_map_.insert(pair<const Element, StateId>(e, s)); 2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return s; 2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Computes the outgoing transitions from a state, creating new destination 2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // states as needed. 2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void Expand(StateId s) { 2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Element e = elements_[s]; 2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (e.state != kNoStateId) { 2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (ArcIterator< Fst<A> > ait(*fst_, e.state); 2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project !ait.Done(); 2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ait.Next()) { 2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const A &arc = ait.Value(); 2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Weight w = Times(e.weight, arc.weight); 2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FactorIterator fit(w); 2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (final_only_ || fit.Done()) { 2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project StateId d = FindState(Element(arc.nextstate, Weight::One())); 266ea4ad6085a8661b5513c394316108c0ef26f3e7bAl Sutton this->AddArc(s, Arc(arc.ilabel, arc.olabel, w, d)); 2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } else { 2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (; !fit.Done(); fit.Next()) { 2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const pair<Weight, Weight> &p = fit.Value(); 2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project StateId d = FindState(Element(arc.nextstate, 2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project p.second.Quantize(delta_))); 272ea4ad6085a8661b5513c394316108c0ef26f3e7bAl Sutton this->AddArc(s, Arc(arc.ilabel, arc.olabel, p.first, d)); 2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((e.state == kNoStateId) || 2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (fst_->Final(e.state) != Weight::Zero())) { 2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Weight w = e.state == kNoStateId 2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ? e.weight 2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : Times(e.weight, fst_->Final(e.state)); 2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (FactorIterator fit(w); 2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project !fit.Done(); 2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fit.Next()) { 2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const pair<Weight, Weight> &p = fit.Value(); 2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project StateId d = FindState(Element(kNoStateId, 2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project p.second.Quantize(delta_))); 288ea4ad6085a8661b5513c394316108c0ef26f3e7bAl Sutton this->AddArc(s, Arc(0, 0, p.first, d)); 2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 291ea4ad6085a8661b5513c394316108c0ef26f3e7bAl Sutton this->SetArcs(s); 2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private: 2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Equality function for Elements, assume weights have been quantized. 2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project class ElementEqual { 2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool operator()(const Element &x, const Element &y) const { 2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return x.state == y.state && x.weight == y.weight; 3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project }; 3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Hash function for Elements to Fst states. 3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project class ElementKey { 3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t operator()(const Element &x) const { 3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return static_cast<size_t>(x.state * kPrime + x.weight.Hash()); 3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private: 3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project static const int kPrime = 7853; 3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project }; 3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef hash_map<Element, StateId, ElementKey, ElementEqual> ElementMap; 3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const Fst<A> *fst_; 3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project float delta_; 3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool final_only_; 3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project vector<Element> elements_; // mapping Fst state to Elements 3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ElementMap element_map_; // mapping Elements to Fst state 3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // mapping between old/new 'StateId' for states that do not need to 3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // be factored when 'final_only_' is true 3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project vector<StateId> unfactored_; 3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project DISALLOW_EVIL_CONSTRUCTORS(FactorWeightFstImpl); 3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// FactorWeightFst takes as template parameter a FactorIterator as 3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// defined above. The result of weight factoring is a transducer 3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// equivalent to the input whose path weights have been factored 3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// according to the FactorIterator. States and transitions will be 3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// added as necessary. The algorithm is a generalization to arbitrary 3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// weights of the second step of the input epsilon-normalization 3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// algorithm due to Mohri, "Generic epsilon-removal and input 3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// epsilon-normalization algorithms for weighted transducers", 3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// International Journal of Computer Science 13(1): 129-143 (2002). 3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A, class F> 3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass FactorWeightFst : public Fst<A> { 3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project friend class ArcIterator< FactorWeightFst<A, F> >; 3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project friend class CacheStateIterator< FactorWeightFst<A, F> >; 3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project friend class CacheArcIterator< FactorWeightFst<A, F> >; 3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef A Arc; 3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename A::Weight Weight; 3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename A::StateId StateId; 3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef CacheState<A> State; 3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FactorWeightFst(const Fst<A> &fst) 3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : impl_(new FactorWeightFstImpl<A, F>(fst, FactorWeightOptions())) {} 3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FactorWeightFst(const Fst<A> &fst, const FactorWeightOptions &opts) 3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : impl_(new FactorWeightFstImpl<A, F>(fst, opts)) {} 3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FactorWeightFst(const FactorWeightFst<A, F> &fst) : Fst<A>(fst), impl_(fst.impl_) { 3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl_->IncrRefCount(); 3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual ~FactorWeightFst() { if (!impl_->DecrRefCount()) delete impl_; } 3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual StateId Start() const { return impl_->Start(); } 3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual Weight Final(StateId s) const { return impl_->Final(s); } 3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual size_t NumArcs(StateId s) const { return impl_->NumArcs(s); } 3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual size_t NumInputEpsilons(StateId s) const { 3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return impl_->NumInputEpsilons(s); 3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual size_t NumOutputEpsilons(StateId s) const { 3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return impl_->NumOutputEpsilons(s); 3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual uint64 Properties(uint64 mask, bool test) const { 3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (test) { 3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project uint64 known, test = TestProperties(*this, mask, &known); 3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl_->SetProperties(test, known); 3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return test & mask; 3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } else { 3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return impl_->Properties(mask); 3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual const string& Type() const { return impl_->Type(); } 3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual FactorWeightFst<A, F> *Copy() const { 3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return new FactorWeightFst<A, F>(*this); 3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual const SymbolTable* InputSymbols() const { 3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return impl_->InputSymbols(); 3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual const SymbolTable* OutputSymbols() const { 3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return impl_->OutputSymbols(); 3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual inline void InitStateIterator(StateIteratorData<A> *data) const; 3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual void InitArcIterator(StateId s, ArcIteratorData<A> *data) const { 4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl_->InitArcIterator(s, data); 4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private: 4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FactorWeightFstImpl<A, F> *Impl() { return impl_; } 4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FactorWeightFstImpl<A, F> *impl_; 4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void operator=(const FactorWeightFst<A, F> &fst); // Disallow 4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Specialization for FactorWeightFst. 4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate<class A, class F> 4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass StateIterator< FactorWeightFst<A, F> > 4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : public CacheStateIterator< FactorWeightFst<A, F> > { 4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project explicit StateIterator(const FactorWeightFst<A, F> &fst) 4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : CacheStateIterator< FactorWeightFst<A, F> >(fst) {} 4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Specialization for FactorWeightFst. 4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A, class F> 4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass ArcIterator< FactorWeightFst<A, F> > 4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : public CacheArcIterator< FactorWeightFst<A, F> > { 4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename A::StateId StateId; 4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ArcIterator(const FactorWeightFst<A, F> &fst, StateId s) 4314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : CacheArcIterator< FactorWeightFst<A, F> >(fst, s) { 4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!fst.impl_->HasArcs(s)) 4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fst.impl_->Expand(s); 4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private: 4374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project DISALLOW_EVIL_CONSTRUCTORS(ArcIterator); 4384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 4394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A, class F> inline 4414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid FactorWeightFst<A, F>::InitStateIterator(StateIteratorData<A> *data) const 4424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 4434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data->base = new StateIterator< FactorWeightFst<A, F> >(*this); 4444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} // namespace fst 4484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif // FST_LIB_FACTOR_WEIGHT_H__ 450