1f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// concat.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// Functions and classes to compute the concat of two FSTs. 20f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 21f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#ifndef FST_LIB_CONCAT_H__ 22f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#define FST_LIB_CONCAT_H__ 23f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 24f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <vector> 25f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::vector; 26f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <algorithm> 27f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 28f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/mutable-fst.h> 29f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/rational.h> 30f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 31f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 32f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace fst { 33f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 34f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Computes the concatenation (product) of two FSTs. If FST1 35f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// transduces string x to y with weight a and FST2 transduces string w 36f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// to v with weight b, then their concatenation transduces string xw 37f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// to yv with Times(a, b). 38f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 39f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// This version modifies its MutableFst argument (in first position). 40f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 41f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Complexity: 42f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// - Time: O(V1 + V2 + E2) 43f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// - Space: O(V1 + V2 + E2) 44f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// where Vi = # of states and Ei = # of arcs of the ith FST. 45f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 46f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class Arc> 47f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonvoid Concat(MutableFst<Arc> *fst1, const Fst<Arc> &fst2) { 48f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename Arc::StateId StateId; 49f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename Arc::Label Label; 50f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename Arc::Weight Weight; 51f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 52f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // TODO(riley): restore when voice actions issues fixed 53f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Check that the symbol table are compatible 54f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!CompatSymbols(fst1->InputSymbols(), fst2.InputSymbols()) || 55f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson !CompatSymbols(fst1->OutputSymbols(), fst2.OutputSymbols())) { 56f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson LOG(ERROR) << "Concat: input/output symbol tables of 1st argument " 57f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson << "do not match input/output symbol tables of 2nd argument"; 58f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // fst1->SetProperties(kError, kError); 59f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // return; 60f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 61f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 62f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson uint64 props1 = fst1->Properties(kFstProperties, false); 63f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson uint64 props2 = fst2.Properties(kFstProperties, false); 64f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 65f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId start1 = fst1->Start(); 66f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (start1 == kNoStateId) { 67f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (props2 & kError) fst1->SetProperties(kError, kError); 68f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return; 69f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 70f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 71f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId numstates1 = fst1->NumStates(); 72f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (fst2.Properties(kExpanded, false)) 73f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst1->ReserveStates(numstates1 + CountStates(fst2)); 74f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 75f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (StateIterator< Fst<Arc> > siter2(fst2); 76f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson !siter2.Done(); 77f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson siter2.Next()) { 78f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId s1 = fst1->AddState(); 79f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId s2 = siter2.Value(); 80f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst1->SetFinal(s1, fst2.Final(s2)); 81f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst1->ReserveArcs(s1, fst2.NumArcs(s2)); 82f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (ArcIterator< Fst<Arc> > aiter(fst2, s2); 83f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson !aiter.Done(); 84f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson aiter.Next()) { 85f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Arc arc = aiter.Value(); 86f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arc.nextstate += numstates1; 87f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst1->AddArc(s1, arc); 88f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 89f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 90f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 91f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId start2 = fst2.Start(); 92f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (StateId s1 = 0; s1 < numstates1; ++s1) { 93f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Weight final = fst1->Final(s1); 94f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (final != Weight::Zero()) { 95f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst1->SetFinal(s1, Weight::Zero()); 96f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (start2 != kNoStateId) 97f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst1->AddArc(s1, Arc(0, 0, final, start2 + numstates1)); 98f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 99f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 100f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (start2 != kNoStateId) 101f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst1->SetProperties(ConcatProperties(props1, props2), kFstProperties); 102f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 103f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 104f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Computes the concatentation of two FSTs. This version modifies its 105f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// MutableFst argument (in second position). 106f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 107f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Complexity: 108f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// - Time: O(V1 + E1) 109f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// - Space: O(V1 + E1) 110f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// where Vi = # of states and Ei = # of arcs of the ith FST. 111f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 112f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class Arc> 113f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonvoid Concat(const Fst<Arc> &fst1, MutableFst<Arc> *fst2) { 114f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename Arc::StateId StateId; 115f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename Arc::Label Label; 116f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename Arc::Weight Weight; 117f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 118f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Check that the symbol table are compatible 119f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!CompatSymbols(fst1.InputSymbols(), fst2->InputSymbols()) || 120f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson !CompatSymbols(fst1.OutputSymbols(), fst2->OutputSymbols())) { 121f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson LOG(ERROR) << "Concat: input/output symbol tables of 1st argument " 122f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson << "do not match input/output symbol tables of 2nd argument"; 123f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // fst2->SetProperties(kError, kError); 124f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // return; 125f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 126f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 127f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson uint64 props1 = fst1.Properties(kFstProperties, false); 128f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson uint64 props2 = fst2->Properties(kFstProperties, false); 129f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 130f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId start2 = fst2->Start(); 131f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (start2 == kNoStateId) { 132f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (props1 & kError) fst2->SetProperties(kError, kError); 133f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return; 134f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 135f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 136f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId numstates2 = fst2->NumStates(); 137f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (fst1.Properties(kExpanded, false)) 138f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst2->ReserveStates(numstates2 + CountStates(fst1)); 139f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 140f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (StateIterator< Fst<Arc> > siter(fst1); 141f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson !siter.Done(); 142f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson siter.Next()) { 143f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId s1 = siter.Value(); 144f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId s2 = fst2->AddState(); 145f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Weight final = fst1.Final(s1); 146f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst2->ReserveArcs(s2, fst1.NumArcs(s1) + (final != Weight::Zero() ? 1 : 0)); 147f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (final != Weight::Zero()) 148f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst2->AddArc(s2, Arc(0, 0, final, start2)); 149f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (ArcIterator< Fst<Arc> > aiter(fst1, s1); 150f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson !aiter.Done(); 151f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson aiter.Next()) { 152f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Arc arc = aiter.Value(); 153f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arc.nextstate += numstates2; 154f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst2->AddArc(s2, arc); 155f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 156f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 157f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId start1 = fst1.Start(); 158f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst2->SetStart(start1 == kNoStateId ? fst2->AddState() : start1 + numstates2); 159f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (start1 != kNoStateId) 160f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst2->SetProperties(ConcatProperties(props1, props2), kFstProperties); 161f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 162f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 163f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 164f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Computes the concatentation of two FSTs. This version modifies its 165f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// RationalFst input (in first position). 166f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class Arc> 167f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonvoid Concat(RationalFst<Arc> *fst1, const Fst<Arc> &fst2) { 168f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst1->GetImpl()->AddConcat(fst2, true); 169f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 170f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 171f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Computes the concatentation of two FSTs. This version modifies its 172f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// RationalFst input (in second position). 173f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class Arc> 174f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonvoid Concat(const Fst<Arc> &fst1, RationalFst<Arc> *fst2) { 175f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst2->GetImpl()->AddConcat(fst1, false); 176f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 177f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 178f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontypedef RationalFstOptions ConcatFstOptions; 179f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 180f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 181f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Computes the concatenation (product) of two FSTs; this version is a 182f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// delayed Fst. If FST1 transduces string x to y with weight a and FST2 183f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// transduces string w to v with weight b, then their concatenation 184f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// transduces string xw to yv with Times(a, b). 185f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 186f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Complexity: 187f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// - Time: O(v1 + e1 + v2 + e2), 188f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// - Space: O(v1 + v2) 189f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// where vi = # of states visited and ei = # of arcs visited of the 190f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// ith FST. Constant time and space to visit an input state or arc is 191f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// assumed and exclusive of caching. 192f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A> 193f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass ConcatFst : public RationalFst<A> { 194f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 195f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson using ImplToFst< RationalFstImpl<A> >::GetImpl; 196f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 197f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef A Arc; 198f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::Weight Weight; 199f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::StateId StateId; 200f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 201f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ConcatFst(const Fst<A> &fst1, const Fst<A> &fst2) { 202f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson GetImpl()->InitConcat(fst1, fst2); 203f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 204f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 205f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ConcatFst(const Fst<A> &fst1, const Fst<A> &fst2, 206f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const ConcatFstOptions &opts) : RationalFst<A>(opts) { 207f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson GetImpl()->InitConcat(fst1, fst2); 208f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 209f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 210f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // See Fst<>::Copy() for doc. 211f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ConcatFst(const ConcatFst<A> &fst, bool safe = false) 212f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : RationalFst<A>(fst, safe) {} 213f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 214f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Get a copy of this ConcatFst. See Fst<>::Copy() for further doc. 215f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson virtual ConcatFst<A> *Copy(bool safe = false) const { 216f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return new ConcatFst<A>(*this, safe); 217f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 218f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 219f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 220f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 221f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Specialization for ConcatFst. 222f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A> 223f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass StateIterator< ConcatFst<A> > : public StateIterator< RationalFst<A> > { 224f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 225f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson explicit StateIterator(const ConcatFst<A> &fst) 226f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : StateIterator< RationalFst<A> >(fst) {} 227f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 228f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 229f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 230f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Specialization for ConcatFst. 231f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A> 232f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass ArcIterator< ConcatFst<A> > : public ArcIterator< RationalFst<A> > { 233f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 234f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::StateId StateId; 235f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 236f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ArcIterator(const ConcatFst<A> &fst, StateId s) 237f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : ArcIterator< RationalFst<A> >(fst, s) {} 238f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 239f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 240f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 241f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Useful alias when using StdArc. 242f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontypedef ConcatFst<StdArc> StdConcatFst; 243f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 244f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} // namespace fst 245f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 246f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#endif // FST_LIB_CONCAT_H__ 247