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)