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