|
|
// Copyright 2005-2024 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the 'License');
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an 'AS IS' BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// See www.openfst.org for extensive documentation on this weighted
// finite-state transducer library.
//
// Conversions to/from PowerWeight and SparsePowerWeight.
#ifndef FST_POWER_WEIGHT_MAPPERS_H_
#define FST_POWER_WEIGHT_MAPPERS_H_
namespace fst {
// Converts FromWeight to ToPowerWeight (with one component).
// ToPowerWeight may be PowerWeight or SparsePowerWeight.
template <class FromWeight_, class ToPowerWeight> class ToPowerWeightMapper { public: using FromWeight = FromWeight_; using ToWeight = ToPowerWeight; using Index = typename ToPowerWeight::Index;
explicit ToPowerWeightMapper(Index index = 0) : index_(index) {}
ToPowerWeight operator()(const FromWeight &w) const { return ToPowerWeight(index_, w.Value()); }
private: const Index index_; };
// Converts FromPowerWeight to ToWeight. Uses only one component.
// FromPowerWeight may be PowerWeight or SparsePowerWeight.
template <class FromPowerWeight, class ToWeight_> class FromPowerWeightMapper { public: using FromWeight = FromPowerWeight; using ToWeight = ToWeight_; using Index = typename FromPowerWeight::Index;
explicit FromPowerWeightMapper(Index index = 0) : index_(index) {}
ToWeight operator()(const FromPowerWeight &w) const { return ToWeight(w.Value(index_)); }
private: const Index index_; };
// Projects to one dimension of the weight vector, filling the indices
// with `default_weight`.
// PowerWeightT may be PowerWeight or SparsePowerWeight.
template <class PowerWeightT> class ProjectPowerWeightMapper { public: using FromWeight = PowerWeightT; using ToWeight = PowerWeightT; using Index = typename PowerWeightT::Index; using ComponentWeight = typename PowerWeightT::Weight;
explicit ProjectPowerWeightMapper( Index from_index = 0, Index to_index = 0, const ComponentWeight &default_weight = ComponentWeight::Zero()) : from_index_(from_index), to_index_(to_index), default_weight_(default_weight) {}
PowerWeightT operator()(const PowerWeightT &w) const { return PowerWeightT(to_index_, w.Value(from_index_), default_weight_); }
private: const Index from_index_; const Index to_index_; const ComponentWeight default_weight_; };
// Applies a transformation function to each weight vector.
// PowerWeightT may be PowerWeight or SparsePowerWeight.
template <class PowerWeightT, class TransformFn_> class TransformPowerWeightMapper { public: using TransformFn = TransformFn_; using FromWeight = PowerWeightT; using ToWeight = PowerWeightT;
explicit TransformPowerWeightMapper( const TransformFn &transform = TransformFn()) : transform_(transform) {}
PowerWeightT operator()(const PowerWeightT &w) const { return transform_(w); }
private: TransformFn transform_; };
} // namespace fst
#endif // FST_POWER_WEIGHT_MAPPERS_H_
|