1f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// factor-weight.h 2f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 3f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Licensed under the Apache License, Version 2.0 (the "License"); 4f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// you may not use this file except in compliance with the License. 5f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// You may obtain a copy of the License at 6f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 7f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// http://www.apache.org/licenses/LICENSE-2.0 8f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 9f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Unless required by applicable law or agreed to in writing, software 10f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// distributed under the License is distributed on an "AS IS" BASIS, 11f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// See the License for the specific language governing permissions and 13f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// limitations under the License. 14f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 15f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Copyright 2005-2010 Google, Inc. 16f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Author: allauzen@google.com (Cyril Allauzen) 17f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 18f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// \file 19f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Classes to factor weights in an FST. 20f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 21f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#ifndef FST_LIB_FACTOR_WEIGHT_H__ 22f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#define FST_LIB_FACTOR_WEIGHT_H__ 23f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 24f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <algorithm> 253da1eb108d36da35333b2d655202791af854996bPrzemyslaw Szczepaniak#include <tr1/unordered_map> 26f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::tr1::unordered_map; 27f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::tr1::unordered_multimap; 28f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <string> 29f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <utility> 30f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::pair; using std::make_pair; 31f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <vector> 32f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::vector; 33f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 34f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/cache.h> 35f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/test-properties.h> 36f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 37f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 38f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace fst { 39f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 40f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonconst uint32 kFactorFinalWeights = 0x00000001; 41f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonconst uint32 kFactorArcWeights = 0x00000002; 42f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 43f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class Arc> 44f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonstruct FactorWeightOptions : CacheOptions { 45f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename Arc::Label Label; 46f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson float delta; 47f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson uint32 mode; // factor arc weights and/or final weights 48f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Label final_ilabel; // input label of arc created when factoring final w's 49f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Label final_olabel; // output label of arc created when factoring final w's 50f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 51f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson FactorWeightOptions(const CacheOptions &opts, float d, 52f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson uint32 m = kFactorArcWeights | kFactorFinalWeights, 53f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Label il = 0, Label ol = 0) 54f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : CacheOptions(opts), delta(d), mode(m), final_ilabel(il), 55f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson final_olabel(ol) {} 56f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 57f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson explicit FactorWeightOptions( 58f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson float d, uint32 m = kFactorArcWeights | kFactorFinalWeights, 59f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Label il = 0, Label ol = 0) 60f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : delta(d), mode(m), final_ilabel(il), final_olabel(ol) {} 61f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 62f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson FactorWeightOptions(uint32 m = kFactorArcWeights | kFactorFinalWeights, 63f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Label il = 0, Label ol = 0) 64f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : delta(kDelta), mode(m), final_ilabel(il), final_olabel(ol) {} 65f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 66f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 67f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 68f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// A factor iterator takes as argument a weight w and returns a 69f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// sequence of pairs of weights (xi,yi) such that the sum of the 70f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// products xi times yi is equal to w. If w is fully factored, 71f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// the iterator should return nothing. 72f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 73f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// template <class W> 74f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// class FactorIterator { 75f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// public: 76f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// FactorIterator(W w); 77f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// bool Done() const; 78f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// void Next(); 79f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// pair<W, W> Value() const; 80f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// void Reset(); 81f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// } 82f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 83f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 84f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Factor trivially. 85f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class W> 86f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass IdentityFactor { 87f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 88f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson IdentityFactor(const W &w) {} 89f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool Done() const { return true; } 90f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Next() {} 91f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson pair<W, W> Value() const { return make_pair(W::One(), W::One()); } // unused 92f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Reset() {} 93f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 94f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 95f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 96f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Factor a StringWeight w as 'ab' where 'a' is a label. 97f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <typename L, StringType S = STRING_LEFT> 98f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass StringFactor { 99f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 100f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StringFactor(const StringWeight<L, S> &w) 101f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : weight_(w), done_(w.Size() <= 1) {} 102f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 103f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool Done() const { return done_; } 104f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 105f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Next() { done_ = true; } 106f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 107f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson pair< StringWeight<L, S>, StringWeight<L, S> > Value() const { 108f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StringWeightIterator<L, S> iter(weight_); 109f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StringWeight<L, S> w1(iter.Value()); 110f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StringWeight<L, S> w2; 111f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (iter.Next(); !iter.Done(); iter.Next()) 112f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson w2.PushBack(iter.Value()); 113f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return make_pair(w1, w2); 114f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 115f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 116f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Reset() { done_ = weight_.Size() <= 1; } 117f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 118f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson private: 119f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StringWeight<L, S> weight_; 120f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool done_; 121f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 122f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 123f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 124f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Factor a GallicWeight using StringFactor. 125f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class L, class W, StringType S = STRING_LEFT> 126f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass GallicFactor { 127f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 128f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson GallicFactor(const GallicWeight<L, W, S> &w) 129f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : weight_(w), done_(w.Value1().Size() <= 1) {} 130f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 131f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool Done() const { return done_; } 132f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 133f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Next() { done_ = true; } 134f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 135f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson pair< GallicWeight<L, W, S>, GallicWeight<L, W, S> > Value() const { 136f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StringFactor<L, S> iter(weight_.Value1()); 137f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson GallicWeight<L, W, S> w1(iter.Value().first, weight_.Value2()); 138f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson GallicWeight<L, W, S> w2(iter.Value().second, W::One()); 139f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return make_pair(w1, w2); 140f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 141f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 142f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Reset() { done_ = weight_.Value1().Size() <= 1; } 143f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 144f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson private: 145f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson GallicWeight<L, W, S> weight_; 146f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool done_; 147f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 148f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 149f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 150f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Implementation class for FactorWeight 151f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A, class F> 152f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass FactorWeightFstImpl 153f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : public CacheImpl<A> { 154f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 155f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using FstImpl<A>::SetType; 156f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using FstImpl<A>::SetProperties; 157f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using FstImpl<A>::SetInputSymbols; 158f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using FstImpl<A>::SetOutputSymbols; 159f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 160f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using CacheBaseImpl< CacheState<A> >::PushArc; 161f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using CacheBaseImpl< CacheState<A> >::HasStart; 162f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using CacheBaseImpl< CacheState<A> >::HasFinal; 163f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using CacheBaseImpl< CacheState<A> >::HasArcs; 164f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using CacheBaseImpl< CacheState<A> >::SetArcs; 165f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using CacheBaseImpl< CacheState<A> >::SetFinal; 166f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using CacheBaseImpl< CacheState<A> >::SetStart; 167f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 168f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef A Arc; 169f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::Label Label; 170f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::Weight Weight; 171f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::StateId StateId; 172f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef F FactorIterator; 173f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 174f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson struct Element { 175f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Element() {} 176f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 177f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Element(StateId s, Weight w) : state(s), weight(w) {} 178f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 179f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId state; // Input state Id 180f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Weight weight; // Residual weight 181f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson }; 182f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 183f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson FactorWeightFstImpl(const Fst<A> &fst, const FactorWeightOptions<A> &opts) 184f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : CacheImpl<A>(opts), 185f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_(fst.Copy()), 186f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson delta_(opts.delta), 187f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson mode_(opts.mode), 188f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson final_ilabel_(opts.final_ilabel), 189f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson final_olabel_(opts.final_olabel) { 190f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetType("factor_weight"); 191f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson uint64 props = fst.Properties(kFstProperties, false); 192f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetProperties(FactorWeightProperties(props), kCopyProperties); 193f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 194f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetInputSymbols(fst.InputSymbols()); 195f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetOutputSymbols(fst.OutputSymbols()); 196f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 197f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (mode_ == 0) 198f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson LOG(WARNING) << "FactorWeightFst: factor mode is set to 0: " 199f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson << "factoring neither arc weights nor final weights."; 200f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 201f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 202f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson FactorWeightFstImpl(const FactorWeightFstImpl<A, F> &impl) 203f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : CacheImpl<A>(impl), 204f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_(impl.fst_->Copy(true)), 205f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson delta_(impl.delta_), 206f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson mode_(impl.mode_), 207f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson final_ilabel_(impl.final_ilabel_), 208f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson final_olabel_(impl.final_olabel_) { 209f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetType("factor_weight"); 210f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetProperties(impl.Properties(), kCopyProperties); 211f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetInputSymbols(impl.InputSymbols()); 212f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetOutputSymbols(impl.OutputSymbols()); 213f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 214f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 215f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ~FactorWeightFstImpl() { 216f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson delete fst_; 217f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 218f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 219f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId Start() { 220f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!HasStart()) { 221f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId s = fst_->Start(); 222f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (s == kNoStateId) 223f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return kNoStateId; 224f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId start = FindState(Element(fst_->Start(), Weight::One())); 225f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetStart(start); 226f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 227f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return CacheImpl<A>::Start(); 228f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 229f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 230f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Weight Final(StateId s) { 231f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!HasFinal(s)) { 232f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const Element &e = elements_[s]; 233f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // TODO: fix so cast is unnecessary 234f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Weight w = e.state == kNoStateId 235f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ? e.weight 236f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : (Weight) Times(e.weight, fst_->Final(e.state)); 237f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson FactorIterator f(w); 238f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!(mode_ & kFactorFinalWeights) || f.Done()) 239f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetFinal(s, w); 240f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else 241f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetFinal(s, Weight::Zero()); 242f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 243f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return CacheImpl<A>::Final(s); 244f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 245f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 246f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson size_t NumArcs(StateId s) { 247f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!HasArcs(s)) 248f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Expand(s); 249f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return CacheImpl<A>::NumArcs(s); 250f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 251f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 252f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson size_t NumInputEpsilons(StateId s) { 253f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!HasArcs(s)) 254f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Expand(s); 255f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return CacheImpl<A>::NumInputEpsilons(s); 256f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 257f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 258f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson size_t NumOutputEpsilons(StateId s) { 259f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!HasArcs(s)) 260f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Expand(s); 261f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return CacheImpl<A>::NumOutputEpsilons(s); 262f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 263f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 264f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson uint64 Properties() const { return Properties(kFstProperties); } 265f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 266f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Set error if found; return FST impl properties. 267f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson uint64 Properties(uint64 mask) const { 268f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if ((mask & kError) && fst_->Properties(kError, false)) 269f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetProperties(kError, kError); 270f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return FstImpl<Arc>::Properties(mask); 271f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 272f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 273f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void InitArcIterator(StateId s, ArcIteratorData<A> *data) { 274f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!HasArcs(s)) 275f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Expand(s); 276f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson CacheImpl<A>::InitArcIterator(s, data); 277f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 278f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 279f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 280f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Find state corresponding to an element. Create new state 281f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // if element not found. 282f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId FindState(const Element &e) { 283f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!(mode_ & kFactorArcWeights) && e.weight == Weight::One()) { 284f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson while (unfactored_.size() <= e.state) 285f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson unfactored_.push_back(kNoStateId); 286f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (unfactored_[e.state] == kNoStateId) { 287f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson unfactored_[e.state] = elements_.size(); 288f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson elements_.push_back(e); 289f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 290f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return unfactored_[e.state]; 291f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } else { 292f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typename ElementMap::iterator eit = element_map_.find(e); 293f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (eit != element_map_.end()) { 294f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return (*eit).second; 295f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } else { 296f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId s = elements_.size(); 297f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson elements_.push_back(e); 298f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson element_map_.insert(pair<const Element, StateId>(e, s)); 299f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return s; 300f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 301f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 302f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 303f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 304f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Computes the outgoing transitions from a state, creating new destination 305f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // states as needed. 306f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Expand(StateId s) { 307f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Element e = elements_[s]; 308f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (e.state != kNoStateId) { 309f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (ArcIterator< Fst<A> > ait(*fst_, e.state); 310f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson !ait.Done(); 311f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ait.Next()) { 312f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const A &arc = ait.Value(); 313f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Weight w = Times(e.weight, arc.weight); 314f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson FactorIterator fit(w); 315f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!(mode_ & kFactorArcWeights) || fit.Done()) { 316f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId d = FindState(Element(arc.nextstate, Weight::One())); 317f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PushArc(s, Arc(arc.ilabel, arc.olabel, w, d)); 318f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } else { 319f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (; !fit.Done(); fit.Next()) { 320f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const pair<Weight, Weight> &p = fit.Value(); 321f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId d = FindState(Element(arc.nextstate, 322f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson p.second.Quantize(delta_))); 323f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PushArc(s, Arc(arc.ilabel, arc.olabel, p.first, d)); 324f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 325f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 326f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 327f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 328f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 329f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if ((mode_ & kFactorFinalWeights) && 330f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ((e.state == kNoStateId) || 331f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson (fst_->Final(e.state) != Weight::Zero()))) { 332f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Weight w = e.state == kNoStateId 333f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ? e.weight 334f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : Times(e.weight, fst_->Final(e.state)); 335f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (FactorIterator fit(w); 336f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson !fit.Done(); 337f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fit.Next()) { 338f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const pair<Weight, Weight> &p = fit.Value(); 339f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId d = FindState(Element(kNoStateId, 340f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson p.second.Quantize(delta_))); 341f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PushArc(s, Arc(final_ilabel_, final_olabel_, p.first, d)); 342f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 343f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 344f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetArcs(s); 345f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 346f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 347f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson private: 348f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson static const size_t kPrime = 7853; 349f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 350f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Equality function for Elements, assume weights have been quantized. 351f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson class ElementEqual { 352f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 353f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool operator()(const Element &x, const Element &y) const { 354f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return x.state == y.state && x.weight == y.weight; 355f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 356f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson }; 357f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 358f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Hash function for Elements to Fst states. 359f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson class ElementKey { 360f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 361f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson size_t operator()(const Element &x) const { 362f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return static_cast<size_t>(x.state * kPrime + x.weight.Hash()); 363f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 364f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson private: 365f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson }; 366f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 367f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef unordered_map<Element, StateId, ElementKey, ElementEqual> ElementMap; 368f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 369f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const Fst<A> *fst_; 370f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson float delta_; 371f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson uint32 mode_; // factoring arc and/or final weights 372f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Label final_ilabel_; // ilabel of arc created when factoring final w's 373f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Label final_olabel_; // olabel of arc created when factoring final w's 374f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson vector<Element> elements_; // mapping Fst state to Elements 375f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ElementMap element_map_; // mapping Elements to Fst state 376f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // mapping between old/new 'StateId' for states that do not need to 377f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // be factored when 'mode_' is '0' or 'kFactorFinalWeights' 378f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson vector<StateId> unfactored_; 379f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 380f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void operator=(const FactorWeightFstImpl<A, F> &); // disallow 381f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 382f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 383f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A, class F> const size_t FactorWeightFstImpl<A, F>::kPrime; 384f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 385f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 386f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// FactorWeightFst takes as template parameter a FactorIterator as 387f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// defined above. The result of weight factoring is a transducer 388f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// equivalent to the input whose path weights have been factored 389f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// according to the FactorIterator. States and transitions will be 390f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// added as necessary. The algorithm is a generalization to arbitrary 391f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// weights of the second step of the input epsilon-normalization 392f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// algorithm due to Mohri, "Generic epsilon-removal and input 393f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// epsilon-normalization algorithms for weighted transducers", 394f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// International Journal of Computer Science 13(1): 129-143 (2002). 395f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 396f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// This class attaches interface to implementation and handles 397f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// reference counting, delegating most methods to ImplToFst. 398f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A, class F> 399f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass FactorWeightFst : public ImplToFst< FactorWeightFstImpl<A, F> > { 400f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 401f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson friend class ArcIterator< FactorWeightFst<A, F> >; 402f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson friend class StateIterator< FactorWeightFst<A, F> >; 403f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 404f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef A Arc; 405f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::Weight Weight; 406f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::StateId StateId; 407f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef CacheState<A> State; 408f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef FactorWeightFstImpl<A, F> Impl; 409f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 410f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson FactorWeightFst(const Fst<A> &fst) 411f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : ImplToFst<Impl>(new Impl(fst, FactorWeightOptions<A>())) {} 412f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 413f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson FactorWeightFst(const Fst<A> &fst, const FactorWeightOptions<A> &opts) 414f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : ImplToFst<Impl>(new Impl(fst, opts)) {} 415f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 416f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // See Fst<>::Copy() for doc. 417f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson FactorWeightFst(const FactorWeightFst<A, F> &fst, bool copy) 418f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : ImplToFst<Impl>(fst, copy) {} 419f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 420f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Get a copy of this FactorWeightFst. See Fst<>::Copy() for further doc. 421f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson virtual FactorWeightFst<A, F> *Copy(bool copy = false) const { 422f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return new FactorWeightFst<A, F>(*this, copy); 423f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 424f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 425f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson virtual inline void InitStateIterator(StateIteratorData<A> *data) const; 426f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 427f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson virtual void InitArcIterator(StateId s, ArcIteratorData<A> *data) const { 428f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson GetImpl()->InitArcIterator(s, data); 429f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 430f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 431f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson private: 432f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Makes visible to friends. 433f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Impl *GetImpl() const { return ImplToFst<Impl>::GetImpl(); } 434f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 435f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void operator=(const FactorWeightFst<A, F> &fst); // Disallow 436f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 437f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 438f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 439f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Specialization for FactorWeightFst. 440f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class A, class F> 441f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass StateIterator< FactorWeightFst<A, F> > 442f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : public CacheStateIterator< FactorWeightFst<A, F> > { 443f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 444f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson explicit StateIterator(const FactorWeightFst<A, F> &fst) 445f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : CacheStateIterator< FactorWeightFst<A, F> >(fst, fst.GetImpl()) {} 446f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 447f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 448f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 449f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Specialization for FactorWeightFst. 450f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A, class F> 451f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass ArcIterator< FactorWeightFst<A, F> > 452f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : public CacheArcIterator< FactorWeightFst<A, F> > { 453f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 454f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::StateId StateId; 455f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 456f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ArcIterator(const FactorWeightFst<A, F> &fst, StateId s) 457f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : CacheArcIterator< FactorWeightFst<A, F> >(fst.GetImpl(), s) { 458f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!fst.GetImpl()->HasArcs(s)) 459f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst.GetImpl()->Expand(s); 460f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 461f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 462f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson private: 463f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson DISALLOW_COPY_AND_ASSIGN(ArcIterator); 464f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 465f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 466f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A, class F> inline 467f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonvoid FactorWeightFst<A, F>::InitStateIterator(StateIteratorData<A> *data) const 468f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson{ 469f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson data->base = new StateIterator< FactorWeightFst<A, F> >(*this); 470f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 471f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 472f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 473f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} // namespace fst 474f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 475f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#endif // FST_LIB_FACTOR_WEIGHT_H__ 476