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