1f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// map.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: riley@google.com (Michael Riley) 17f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 18f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// \file 19f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Class to map over/transform states e.g., sort transitions 20f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Consider using when operation does not change the number of states. 21f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 22f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#ifndef FST_LIB_STATE_MAP_H__ 23f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#define FST_LIB_STATE_MAP_H__ 24f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 25f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <algorithm> 263da1eb108d36da35333b2d655202791af854996bPrzemyslaw Szczepaniak#include <tr1/unordered_map> 27f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::tr1::unordered_map; 28f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::tr1::unordered_multimap; 29f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <string> 30f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <utility> 31f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::pair; using std::make_pair; 32f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 33f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/cache.h> 34f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/arc-map.h> 35f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/mutable-fst.h> 36f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 37f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 38f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace fst { 39f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 40f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// StateMapper Interface - class determinies how states are mapped. 41f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Useful for implementing operations that do not change the number of states. 42f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 43f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// class StateMapper { 44f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// public: 45f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// typedef A FromArc; 46f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// typedef B ToArc; 47f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 48f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// // Typical constructor 49f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// StateMapper(const Fst<A> &fst); 50f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// // Required copy constructor that allows updating Fst argument; 51f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// // pass only if relevant and changed. 52f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// StateMapper(const StateMapper &mapper, const Fst<A> *fst = 0); 53f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 54f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// // Specifies initial state of result 55f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// B::StateId Start() const; 56f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// // Specifies state's final weight in result 57f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// B::Weight Final(B::StateId s) const; 58f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 59f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// // These methods iterate through a state's arcs in result 60f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// // Specifies state to iterate over 61f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// void SetState(B::StateId s); 62f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// // End of arcs? 63f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// bool Done() const; 64f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// // Current arc 65f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 66f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// const B &Value() const; 67f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// // Advance to next arc (when !Done) 68f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// void Next(); 69f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 70f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// // Specifies input symbol table action the mapper requires (see above). 71f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// MapSymbolsAction InputSymbolsAction() const; 72f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// // Specifies output symbol table action the mapper requires (see above). 73f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// MapSymbolsAction OutputSymbolsAction() const; 74f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// // This specifies the known properties of an Fst mapped by this 75f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// // mapper. It takes as argument the input Fst's known properties. 76f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// uint64 Properties(uint64 props) const; 77f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// }; 78f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 79f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// We include a various state map versions below. One dimension of 80f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// variation is whether the mapping mutates its input, writes to a 81f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// new result Fst, or is an on-the-fly Fst. Another dimension is how 82f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// we pass the mapper. We allow passing the mapper by pointer 83f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// for cases that we need to change the state of the user's mapper. 84f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// We also include map versions that pass the mapper 85f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// by value or const reference when this suffices. 86f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 87f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Maps an arc type A using a mapper function object C, passed 88f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// by pointer. This version modifies its Fst input. 89f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class A, class C> 90f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonvoid StateMap(MutableFst<A> *fst, C* mapper) { 91f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::StateId StateId; 92f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::Weight Weight; 93f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 94f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (mapper->InputSymbolsAction() == MAP_CLEAR_SYMBOLS) 95f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst->SetInputSymbols(0); 96f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 97f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (mapper->OutputSymbolsAction() == MAP_CLEAR_SYMBOLS) 98f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst->SetOutputSymbols(0); 99f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 100f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (fst->Start() == kNoStateId) 101f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return; 102f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 103f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson uint64 props = fst->Properties(kFstProperties, false); 104f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 105f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst->SetStart(mapper->Start()); 106f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 107f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (StateId s = 0; s < fst->NumStates(); ++s) { 108f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson mapper->SetState(s); 109f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst->DeleteArcs(s); 110f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (; !mapper->Done(); mapper->Next()) 111f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst->AddArc(s, mapper->Value()); 112f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst->SetFinal(s, mapper->Final(s)); 113f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 114f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 115f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst->SetProperties(mapper->Properties(props), kFstProperties); 116f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 117f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 118f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Maps an arc type A using a mapper function object C, passed 119f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// by value. This version modifies its Fst input. 120f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class A, class C> 121f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonvoid StateMap(MutableFst<A> *fst, C mapper) { 122f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateMap(fst, &mapper); 123f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 124f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 125f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 126f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Maps an arc type A to an arc type B using mapper function 127f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// object C, passed by pointer. This version writes the mapped 128f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// input Fst to an output MutableFst. 129f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class A, class B, class C> 130f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonvoid StateMap(const Fst<A> &ifst, MutableFst<B> *ofst, C* mapper) { 131f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::StateId StateId; 132f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::Weight Weight; 133f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 134f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ofst->DeleteStates(); 135f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 136f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (mapper->InputSymbolsAction() == MAP_COPY_SYMBOLS) 137f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ofst->SetInputSymbols(ifst.InputSymbols()); 138f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else if (mapper->InputSymbolsAction() == MAP_CLEAR_SYMBOLS) 139f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ofst->SetInputSymbols(0); 140f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 141f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (mapper->OutputSymbolsAction() == MAP_COPY_SYMBOLS) 142f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ofst->SetOutputSymbols(ifst.OutputSymbols()); 143f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else if (mapper->OutputSymbolsAction() == MAP_CLEAR_SYMBOLS) 144f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ofst->SetOutputSymbols(0); 145f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 146f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson uint64 iprops = ifst.Properties(kCopyProperties, false); 147f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 148f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (ifst.Start() == kNoStateId) { 149f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (iprops & kError) ofst->SetProperties(kError, kError); 150f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return; 151f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 152f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 153f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Add all states. 154f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (ifst.Properties(kExpanded, false)) 155f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ofst->ReserveStates(CountStates(ifst)); 156f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (StateIterator< Fst<A> > siter(ifst); !siter.Done(); siter.Next()) 157f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ofst->AddState(); 158f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 159f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ofst->SetStart(mapper->Start()); 160f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 161f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (StateIterator< Fst<A> > siter(ifst); !siter.Done(); siter.Next()) { 162f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId s = siter.Value(); 163f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson mapper->SetState(s); 164f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (; !mapper->Done(); mapper->Next()) 165f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ofst->AddArc(s, mapper->Value()); 166f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ofst->SetFinal(s, mapper->Final(s)); 167f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 168f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 169f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson uint64 oprops = ofst->Properties(kFstProperties, false); 170f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ofst->SetProperties(mapper->Properties(iprops) | oprops, kFstProperties); 171f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 172f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 173f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Maps an arc type A to an arc type B using mapper function 174f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// object C, passed by value. This version writes the mapped input 175f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Fst to an output MutableFst. 176f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class A, class B, class C> 177f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonvoid StateMap(const Fst<A> &ifst, MutableFst<B> *ofst, C mapper) { 178f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateMap(ifst, ofst, &mapper); 179f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 180f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 181f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontypedef CacheOptions StateMapFstOptions; 182f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 183f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A, class B, class C> class StateMapFst; 184f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 185f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Implementation of delayed StateMapFst. 186f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A, class B, class C> 187f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass StateMapFstImpl : public CacheImpl<B> { 188f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 189f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using FstImpl<B>::SetType; 190f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using FstImpl<B>::SetProperties; 191f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using FstImpl<B>::SetInputSymbols; 192f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using FstImpl<B>::SetOutputSymbols; 193f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 194f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using CacheImpl<B>::PushArc; 195f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using CacheImpl<B>::HasArcs; 196f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using CacheImpl<B>::HasFinal; 197f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using CacheImpl<B>::HasStart; 198f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using CacheImpl<B>::SetArcs; 199f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using CacheImpl<B>::SetFinal; 200f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using CacheImpl<B>::SetStart; 201f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 202f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson friend class StateIterator< StateMapFst<A, B, C> >; 203f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 204f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef B Arc; 205f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename B::Weight Weight; 206f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename B::StateId StateId; 207f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 208f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateMapFstImpl(const Fst<A> &fst, const C &mapper, 209f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const StateMapFstOptions& opts) 210f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : CacheImpl<B>(opts), 211f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_(fst.Copy()), 212f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson mapper_(new C(mapper, fst_)), 213f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson own_mapper_(true) { 214f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Init(); 215f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 216f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 217f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateMapFstImpl(const Fst<A> &fst, C *mapper, 218f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const StateMapFstOptions& opts) 219f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : CacheImpl<B>(opts), 220f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_(fst.Copy()), 221f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson mapper_(mapper), 222f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson own_mapper_(false) { 223f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Init(); 224f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 225f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 226f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateMapFstImpl(const StateMapFstImpl<A, B, C> &impl) 227f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : CacheImpl<B>(impl), 228f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_(impl.fst_->Copy(true)), 229f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson mapper_(new C(*impl.mapper_, fst_)), 230f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson own_mapper_(true) { 231f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Init(); 232f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 233f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 234f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ~StateMapFstImpl() { 235f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson delete fst_; 236f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (own_mapper_) delete mapper_; 237f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 238f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 239f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId Start() { 240f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!HasStart()) 241f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetStart(mapper_->Start()); 242f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return CacheImpl<B>::Start(); 243f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 244f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 245f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Weight Final(StateId s) { 246f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!HasFinal(s)) 247f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetFinal(s, mapper_->Final(s)); 248f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return CacheImpl<B>::Final(s); 249f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 250f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 251f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson size_t NumArcs(StateId s) { 252f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!HasArcs(s)) 253f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Expand(s); 254f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return CacheImpl<B>::NumArcs(s); 255f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 256f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 257f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson size_t NumInputEpsilons(StateId s) { 258f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!HasArcs(s)) 259f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Expand(s); 260f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return CacheImpl<B>::NumInputEpsilons(s); 261f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 262f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 263f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson size_t NumOutputEpsilons(StateId s) { 264f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!HasArcs(s)) 265f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Expand(s); 266f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return CacheImpl<B>::NumOutputEpsilons(s); 267f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 268f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 269f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void InitStateIterator(StateIteratorData<A> *data) const { 270f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_->InitStateIterator(data); 271f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 272f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 273f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void InitArcIterator(StateId s, ArcIteratorData<B> *data) { 274f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!HasArcs(s)) 275f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Expand(s); 276f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson CacheImpl<B>::InitArcIterator(s, data); 277f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 278f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 279f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson uint64 Properties() const { return Properties(kFstProperties); } 280f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 281f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Set error if found; return FST impl properties. 282f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson uint64 Properties(uint64 mask) const { 283f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if ((mask & kError) && (fst_->Properties(kError, false) || 284f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson (mapper_->Properties(0) & kError))) 285f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetProperties(kError, kError); 286f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return FstImpl<Arc>::Properties(mask); 287f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 288f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 289f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Expand(StateId s) { 290f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Add exiting arcs. 291f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (mapper_->SetState(s); !mapper_->Done(); mapper_->Next()) 292f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PushArc(s, mapper_->Value()); 293f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetArcs(s); 294f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 295f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 296dfd8b8327b93660601d016cdc6f29f433b45a8d8Alexander Gutkin const Fst<A> &GetFst() const { 297dfd8b8327b93660601d016cdc6f29f433b45a8d8Alexander Gutkin return *fst_; 298dfd8b8327b93660601d016cdc6f29f433b45a8d8Alexander Gutkin } 299dfd8b8327b93660601d016cdc6f29f433b45a8d8Alexander Gutkin 300f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson private: 301f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Init() { 302f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetType("statemap"); 303f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 304f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (mapper_->InputSymbolsAction() == MAP_COPY_SYMBOLS) 305f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetInputSymbols(fst_->InputSymbols()); 306f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else if (mapper_->InputSymbolsAction() == MAP_CLEAR_SYMBOLS) 307f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetInputSymbols(0); 308f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 309f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (mapper_->OutputSymbolsAction() == MAP_COPY_SYMBOLS) 310f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetOutputSymbols(fst_->OutputSymbols()); 311f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else if (mapper_->OutputSymbolsAction() == MAP_CLEAR_SYMBOLS) 312f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetOutputSymbols(0); 313f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 314f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson uint64 props = fst_->Properties(kCopyProperties, false); 315f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SetProperties(mapper_->Properties(props)); 316f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 317f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 318f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const Fst<A> *fst_; 319f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson C* mapper_; 320f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool own_mapper_; 321f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 322f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void operator=(const StateMapFstImpl<A, B, C> &); // disallow 323f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 324f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 325f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 326f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Maps an arc type A to an arc type B using Mapper function object 327f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// C. This version is a delayed Fst. 328f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A, class B, class C> 329f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass StateMapFst : public ImplToFst< StateMapFstImpl<A, B, C> > { 330f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 331f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson friend class ArcIterator< StateMapFst<A, B, C> >; 332f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 333f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef B Arc; 334f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename B::Weight Weight; 335f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename B::StateId StateId; 336f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef CacheState<B> State; 337f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef StateMapFstImpl<A, B, C> Impl; 338f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 339f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateMapFst(const Fst<A> &fst, const C &mapper, 340f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const StateMapFstOptions& opts) 341f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : ImplToFst<Impl>(new Impl(fst, mapper, opts)) {} 342f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 343f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateMapFst(const Fst<A> &fst, C* mapper, const StateMapFstOptions& opts) 344f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : ImplToFst<Impl>(new Impl(fst, mapper, opts)) {} 345f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 346f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateMapFst(const Fst<A> &fst, const C &mapper) 347f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : ImplToFst<Impl>(new Impl(fst, mapper, StateMapFstOptions())) {} 348f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 349f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateMapFst(const Fst<A> &fst, C* mapper) 350f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : ImplToFst<Impl>(new Impl(fst, mapper, StateMapFstOptions())) {} 351f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 352f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // See Fst<>::Copy() for doc. 353f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateMapFst(const StateMapFst<A, B, C> &fst, bool safe = false) 354f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : ImplToFst<Impl>(fst, safe) {} 355f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 356f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Get a copy of this StateMapFst. See Fst<>::Copy() for further doc. 357f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson virtual StateMapFst<A, B, C> *Copy(bool safe = false) const { 358f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return new StateMapFst<A, B, C>(*this, safe); 359f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 360f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 361f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson virtual void InitStateIterator(StateIteratorData<A> *data) const { 362f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson GetImpl()->InitStateIterator(data); 363f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 364f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 365f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson virtual void InitArcIterator(StateId s, ArcIteratorData<B> *data) const { 366f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson GetImpl()->InitArcIterator(s, data); 367f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 368f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 369dfd8b8327b93660601d016cdc6f29f433b45a8d8Alexander Gutkin protected: 370f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Impl *GetImpl() const { return ImplToFst<Impl>::GetImpl(); } 371f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 372dfd8b8327b93660601d016cdc6f29f433b45a8d8Alexander Gutkin private: 373f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void operator=(const StateMapFst<A, B, C> &fst); // disallow 374f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 375f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 376f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 377f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Specialization for StateMapFst. 378f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A, class B, class C> 379f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass ArcIterator< StateMapFst<A, B, C> > 380f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : public CacheArcIterator< StateMapFst<A, B, C> > { 381f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 382f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::StateId StateId; 383f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 384f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ArcIterator(const StateMapFst<A, B, C> &fst, StateId s) 385f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : CacheArcIterator< StateMapFst<A, B, C> >(fst.GetImpl(), s) { 386f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!fst.GetImpl()->HasArcs(s)) 387f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst.GetImpl()->Expand(s); 388f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 389f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 390f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson private: 391f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson DISALLOW_COPY_AND_ASSIGN(ArcIterator); 392f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 393f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 394f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 395f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Utility Mappers 396f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 397f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 398f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Mapper that returns its input. 399f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A> 400f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass IdentityStateMapper { 401f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 402f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef A FromArc; 403f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef A ToArc; 404f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 405f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::StateId StateId; 406f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::Weight Weight; 407f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 408f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson explicit IdentityStateMapper(const Fst<A> &fst) : fst_(fst), aiter_(0) {} 409f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 410f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Allows updating Fst argument; pass only if changed. 411f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson IdentityStateMapper(const IdentityStateMapper<A> &mapper, 412f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const Fst<A> *fst = 0) 413f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : fst_(fst ? *fst : mapper.fst_), aiter_(0) {} 414f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 415f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ~IdentityStateMapper() { delete aiter_; } 416f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 417f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId Start() const { return fst_.Start(); } 418f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 419f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Weight Final(StateId s) const { return fst_.Final(s); } 420f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 421f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void SetState(StateId s) { 422f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (aiter_) delete aiter_; 423f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson aiter_ = new ArcIterator< Fst<A> >(fst_, s); 424f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 425f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 426f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool Done() const { return aiter_->Done(); } 427f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const A &Value() const { return aiter_->Value(); } 428f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Next() { aiter_->Next(); } 429f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 430f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } 431f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} 432f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 433f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson uint64 Properties(uint64 props) const { return props; } 434f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 435f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson private: 436f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const Fst<A> &fst_; 437f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ArcIterator< Fst<A> > *aiter_; 438f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 439f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 440f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A> 441f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass ArcSumMapper { 442f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 443f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef A FromArc; 444f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef A ToArc; 445f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 446f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::StateId StateId; 447f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::Weight Weight; 448f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 449f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson explicit ArcSumMapper(const Fst<A> &fst) : fst_(fst), i_(0) {} 450f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 451f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Allows updating Fst argument; pass only if changed. 452f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ArcSumMapper(const ArcSumMapper<A> &mapper, 453f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const Fst<A> *fst = 0) 454f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : fst_(fst ? *fst : mapper.fst_), i_(0) {} 455f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 456f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId Start() const { return fst_.Start(); } 457f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Weight Final(StateId s) const { return fst_.Final(s); } 458f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 459f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void SetState(StateId s) { 460f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson i_ = 0; 461f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arcs_.clear(); 462f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arcs_.reserve(fst_.NumArcs(s)); 463f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (ArcIterator<Fst<A> > aiter(fst_, s); !aiter.Done(); aiter.Next()) 464f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arcs_.push_back(aiter.Value()); 465f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 466f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // First sorts the exiting arcs by input label, output label 467f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // and destination state and then sums weights of arcs with 468f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // the same input label, output label, and destination state. 469f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson sort(arcs_.begin(), arcs_.end(), comp_); 470f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson size_t narcs = 0; 471f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (size_t i = 0; i < arcs_.size(); ++i) { 472f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (narcs > 0 && equal_(arcs_[i], arcs_[narcs - 1])) { 473f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arcs_[narcs - 1].weight = Plus(arcs_[narcs - 1].weight, 474f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arcs_[i].weight); 475f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } else { 476f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arcs_[narcs++] = arcs_[i]; 477f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 478f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 479f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arcs_.resize(narcs); 480f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 481f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 482f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool Done() const { return i_ >= arcs_.size(); } 483f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const A &Value() const { return arcs_[i_]; } 484f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Next() { ++i_; } 485f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 486f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } 487f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS; } 488f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 489f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson uint64 Properties(uint64 props) const { 490f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return props & kArcSortProperties & 491f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson kDeleteArcsProperties & kWeightInvariantProperties; 492f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 493f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 494f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson private: 495f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson struct Compare { 496f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool operator()(const A& x, const A& y) { 497f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (x.ilabel < y.ilabel) return true; 498f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (x.ilabel > y.ilabel) return false; 499f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (x.olabel < y.olabel) return true; 500f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (x.olabel > y.olabel) return false; 501f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (x.nextstate < y.nextstate) return true; 502f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (x.nextstate > y.nextstate) return false; 503f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return false; 504f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 505f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson }; 506f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 507f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson struct Equal { 508f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool operator()(const A& x, const A& y) { 509f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return (x.ilabel == y.ilabel && 510f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson x.olabel == y.olabel && 511f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson x.nextstate == y.nextstate); 512f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 513f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson }; 514f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 515f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const Fst<A> &fst_; 516f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Compare comp_; 517f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Equal equal_; 518f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson vector<A> arcs_; 519f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ssize_t i_; // current arc position 520f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 521f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void operator=(const ArcSumMapper<A> &); // disallow 522f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 523f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 524f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A> 525f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass ArcUniqueMapper { 526f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 527f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef A FromArc; 528f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef A ToArc; 529f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 530f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::StateId StateId; 531f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::Weight Weight; 532f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 533f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson explicit ArcUniqueMapper(const Fst<A> &fst) : fst_(fst), i_(0) {} 534f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 535f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Allows updating Fst argument; pass only if changed. 5365b6dc79427b8f7eeb6a7ff68034ab8548ce670eaAlexander Gutkin ArcUniqueMapper(const ArcUniqueMapper<A> &mapper, 537f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const Fst<A> *fst = 0) 538f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : fst_(fst ? *fst : mapper.fst_), i_(0) {} 539f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 540f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId Start() const { return fst_.Start(); } 541f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Weight Final(StateId s) const { return fst_.Final(s); } 542f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 543f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void SetState(StateId s) { 544f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson i_ = 0; 545f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arcs_.clear(); 546f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arcs_.reserve(fst_.NumArcs(s)); 547f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (ArcIterator<Fst<A> > aiter(fst_, s); !aiter.Done(); aiter.Next()) 548f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arcs_.push_back(aiter.Value()); 549f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 550f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // First sorts the exiting arcs by input label, output label 551f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // and destination state and then uniques identical arcs 552f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson sort(arcs_.begin(), arcs_.end(), comp_); 553f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typename vector<A>::iterator unique_end = 554f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson unique(arcs_.begin(), arcs_.end(), equal_); 555f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arcs_.resize(unique_end - arcs_.begin()); 556f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 557f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 558f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool Done() const { return i_ >= arcs_.size(); } 559f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const A &Value() const { return arcs_[i_]; } 560f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Next() { ++i_; } 561f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 562f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } 563f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS; } 564f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 565f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson uint64 Properties(uint64 props) const { 566f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return props & kArcSortProperties & kDeleteArcsProperties; 567f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 568f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 569f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson private: 570f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson struct Compare { 571f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool operator()(const A& x, const A& y) { 572f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (x.ilabel < y.ilabel) return true; 573f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (x.ilabel > y.ilabel) return false; 574f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (x.olabel < y.olabel) return true; 575f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (x.olabel > y.olabel) return false; 576f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (x.nextstate < y.nextstate) return true; 577f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (x.nextstate > y.nextstate) return false; 578f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return false; 579f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 580f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson }; 581f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 582f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson struct Equal { 583f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool operator()(const A& x, const A& y) { 584f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return (x.ilabel == y.ilabel && 585f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson x.olabel == y.olabel && 586f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson x.nextstate == y.nextstate && 587f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson x.weight == y.weight); 588f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 589f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson }; 590f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 591f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const Fst<A> &fst_; 592f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Compare comp_; 593f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Equal equal_; 594f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson vector<A> arcs_; 595f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ssize_t i_; // current arc position 596f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 597f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void operator=(const ArcUniqueMapper<A> &); // disallow 598f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 599f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 600f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 601f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} // namespace fst 602f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 603f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#endif // FST_LIB_STATE_MAP_H__ 604