1f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// arcfilter.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// Function objects to restrict which arcs are traversed in an FST. 20f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 21f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#ifndef FST_LIB_ARCFILTER_H__ 22f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#define FST_LIB_ARCFILTER_H__ 23f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 24f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 25f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/fst.h> 26f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/util.h> 27f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 28f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 29f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace fst { 30f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 31f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// True for all arcs. 32f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A> 33f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass AnyArcFilter { 34f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonpublic: 35f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool operator()(const A &arc) const { return true; } 36f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 37f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 38f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 39f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// True for (input/output) epsilon arcs. 40f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A> 41f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass EpsilonArcFilter { 42f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonpublic: 43f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool operator()(const A &arc) const { 44f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return arc.ilabel == 0 && arc.olabel == 0; 45f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 46f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 47f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 48f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 49f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// True for input epsilon arcs. 50f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A> 51f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass InputEpsilonArcFilter { 52f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonpublic: 53f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool operator()(const A &arc) const { 54f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return arc.ilabel == 0; 55f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 56f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 57f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 58f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 59f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// True for output epsilon arcs. 60f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A> 61f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass OutputEpsilonArcFilter { 62f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonpublic: 63f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool operator()(const A &arc) const { 64f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return arc.olabel == 0; 65f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 66f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 67f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 68f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 69f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// True if specified labels match (don't match) when keep_match is 70f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// true (false). 71f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A> 72f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass MultiLabelArcFilter { 73f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonpublic: 74f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::Label Label; 75f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 76f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson MultiLabelArcFilter(bool match_input = true, bool keep_match = true) 77f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : match_input_(match_input), 78f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson keep_match_(keep_match) {} 79f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 80f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 81f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool operator()(const A &arc) const { 82f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Label label = match_input_ ? arc.ilabel : arc.olabel; 83f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool match = labels_.Find(label) != labels_.End(); 84f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return keep_match_ ? match : !match; 85f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 86f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 87f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void AddLabel(Label label) { 88f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson labels_.Insert(label); 89f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 90f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 91f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonprivate: 92f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson CompactSet<Label, kNoLabel> labels_; 93f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool match_input_; 94f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool keep_match_; 95f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 96f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 97f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} // namespace fst 98f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 99f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#endif // FST_LIB_ARCFILTER_H__ 100