product-weight.h revision f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2
1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// product-weight.h 2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Licensed under the Apache License, Version 2.0 (the "License"); 4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// you may not use this file except in compliance with the License. 51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// You may obtain a copy of the License at 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// http://www.apache.org/licenses/LICENSE-2.0 8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Unless required by applicable law or agreed to in writing, software 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// distributed under the License is distributed on an "AS IS" BASIS, 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// See the License for the specific language governing permissions and 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// limitations under the License. 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2005-2010 Google, Inc. 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Author: riley@google.com (Michael Riley) 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// \file 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Product weight set and associated semiring operation definitions. 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef FST_LIB_PRODUCT_WEIGHT_H__ 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define FST_LIB_PRODUCT_WEIGHT_H__ 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include <stack> 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <string> 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <fst/pair-weight.h> 28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include <fst/weight.h> 29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace fst { 32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Product semiring: W1 * W2 34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)template<class W1, class W2> 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ProductWeight : public PairWeight<W1, W2> { 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) using PairWeight<W1, W2>::Zero; 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) using PairWeight<W1, W2>::One; 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) using PairWeight<W1, W2>::NoWeight; 40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) using PairWeight<W1, W2>::Quantize; 41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) using PairWeight<W1, W2>::Reverse; 42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef ProductWeight<typename W1::ReverseWeight, typename W2::ReverseWeight> 44424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ReverseWeight; 45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 46424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ProductWeight() {} 47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ProductWeight(const PairWeight<W1, W2>& w) : PairWeight<W1, W2>(w) {} 49424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ProductWeight(W1 w1, W2 w2) : PairWeight<W1, W2>(w1, w2) {} 51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static const ProductWeight<W1, W2> &Zero() { 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static const ProductWeight<W1, W2> zero(PairWeight<W1, W2>::Zero()); 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return zero; 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 56424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static const ProductWeight<W1, W2> &One() { 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static const ProductWeight<W1, W2> one(PairWeight<W1, W2>::One()); 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return one; 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 62424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) static const ProductWeight<W1, W2> &NoWeight() { 63424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) static const ProductWeight<W1, W2> no_weight( 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PairWeight<W1, W2>::NoWeight()); 65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return no_weight; 66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 68424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) static const string &Type() { 69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static const string type = W1::Type() + "_X_" + W2::Type(); 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return type; 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 72424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 73424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) static uint64 Properties() { 74424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) uint64 props1 = W1::Properties(); 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint64 props2 = W2::Properties(); 76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return props1 & props2 & (kLeftSemiring | kRightSemiring | 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kCommutative | kIdempotent); 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProductWeight<W1, W2> Quantize(float delta = kDelta) const { 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return PairWeight<W1, W2>::Quantize(delta); 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ReverseWeight Reverse() const { 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return PairWeight<W1, W2>::Reverse(); 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)template <class W1, class W2> 92424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)inline ProductWeight<W1, W2> Plus(const ProductWeight<W1, W2> &w, 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const ProductWeight<W1, W2> &v) { 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ProductWeight<W1, W2>(Plus(w.Value1(), v.Value1()), 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Plus(w.Value2(), v.Value2())); 96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <class W1, class W2> 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)inline ProductWeight<W1, W2> Times(const ProductWeight<W1, W2> &w, 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ProductWeight<W1, W2> &v) { 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ProductWeight<W1, W2>(Times(w.Value1(), v.Value1()), 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Times(w.Value2(), v.Value2())); 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <class W1, class W2> 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)inline ProductWeight<W1, W2> Divide(const ProductWeight<W1, W2> &w, 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ProductWeight<W1, W2> &v, 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DivideType typ = DIVIDE_ANY) { 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ProductWeight<W1, W2>(Divide(w.Value1(), v.Value1(), typ), 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Divide(w.Value2(), v.Value2(), typ)); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace fst 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // FST_LIB_PRODUCT_WEIGHT_H__ 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)