14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// project.h 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Licensed under the Apache License, Version 2.0 (the "License"); 44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// you may not use this file except in compliance with the License. 54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// You may obtain a copy of the License at 64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// http://www.apache.org/licenses/LICENSE-2.0 84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Unless required by applicable law or agreed to in writing, software 104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// distributed under the License is distributed on an "AS IS" BASIS, 114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// See the License for the specific language governing permissions and 134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// limitations under the License. 144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// \file 174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Functions and classes to project an Fst on to its domain or range. 184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef FST_LIB_PROJECT_H__ 204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define FST_LIB_PROJECT_H__ 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "fst/lib/map.h" 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "fst/lib/mutable-fst.h" 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectnamespace fst { 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// This specifies whether to project on input or output. 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectenum ProjectType { PROJECT_INPUT = 1, PROJECT_OUTPUT = 2 }; 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Mapper to implement projection per arc. 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> class ProjectMapper { 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project explicit ProjectMapper(ProjectType project_type) 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : project_type_(project_type) {} 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project A operator()(const A &arc) { 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typename A::Label label = project_type_ == PROJECT_INPUT 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ? arc.ilabel : arc.olabel; 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return A(label, label, arc.weight, arc.nextstate); 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project uint64 Properties(uint64 props) { 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ProjectProperties(props, project_type_ == PROJECT_INPUT); 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private: 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ProjectType project_type_; 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Projects an FST onto its domain or range by either copying each arcs' 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// input label to the output label or vice versa. This version modifies 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// its input. 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Complexity: 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// - Time: O(V + E) 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// - Space: O(1) 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// where V = # of states and E = # of arcs. 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate<class Arc> inline 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid Project(MutableFst<Arc> *fst, ProjectType project_type) { 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Map(fst, ProjectMapper<Arc>(project_type)); 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Projects an FST onto its domain or range by either copying each arc's 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// input label to the output label or vice versa. This version is a delayed 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Fst. 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Complexity: 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// - Time: O(v + e) 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// - Space: O(1) 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// where v = # of states visited, e = # of arcs visited. Constant 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// time and to visit an input state or arc is assumed and exclusive 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// of caching. 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass ProjectFst : public MapFst<A, A, ProjectMapper<A> > { 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef A Arc; 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef ProjectMapper<A> C; 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ProjectFst(const Fst<A> &fst, ProjectType project_type) 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : MapFst<A, A, C>(fst, C(project_type)) {} 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ProjectFst(const ProjectFst<A> &fst) : MapFst<A, A, C>(fst) {} 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual ProjectFst<A> *Copy() const { return new ProjectFst(*this); } 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Specialization for ProjectFst. 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass StateIterator< ProjectFst<A> > 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : public StateIterator< MapFst<A, A, ProjectMapper<A> > > { 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project explicit StateIterator(const ProjectFst<A> &fst) 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : StateIterator< MapFst<A, A, ProjectMapper<A> > >(fst) {} 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Specialization for ProjectFst. 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass ArcIterator< ProjectFst<A> > 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : public ArcIterator< MapFst<A, A, ProjectMapper<A> > > { 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ArcIterator(const ProjectFst<A> &fst, typename A::StateId s) 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : ArcIterator< MapFst<A, A, ProjectMapper<A> > >(fst, s) {} 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Useful alias when using StdArc. 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttypedef ProjectFst<StdArc> StdProjectFst; 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} // namespace fst 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif // FST_LIB_PROJECT_H__ 119