// 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 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 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 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 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_