diff options
Diffstat (limited to 'kaldi_io/src/tools/openfst/include/fst/pair-weight.h')
-rw-r--r-- | kaldi_io/src/tools/openfst/include/fst/pair-weight.h | 280 |
1 files changed, 0 insertions, 280 deletions
diff --git a/kaldi_io/src/tools/openfst/include/fst/pair-weight.h b/kaldi_io/src/tools/openfst/include/fst/pair-weight.h deleted file mode 100644 index 7d8aa11..0000000 --- a/kaldi_io/src/tools/openfst/include/fst/pair-weight.h +++ /dev/null @@ -1,280 +0,0 @@ -// pair-weight.h - -// 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. -// -// Copyright 2005-2010 Google, Inc. -// Author: [email protected] (Masha Maria Shugrina) -// -// \file -// Pair weight templated base class for weight classes that -// contain two weights (e.g. Product, Lexicographic) - -#ifndef FST_LIB_PAIR_WEIGHT_H_ -#define FST_LIB_PAIR_WEIGHT_H_ - -#include <climits> -#include <stack> -#include <string> - -#include <fst/weight.h> - - -DECLARE_string(fst_weight_parentheses); -DECLARE_string(fst_weight_separator); - -namespace fst { - -template<class W1, class W2> class PairWeight; -template <class W1, class W2> -istream &operator>>(istream &strm, PairWeight<W1, W2> &w); - -template<class W1, class W2> -class PairWeight { - public: - friend istream &operator>><W1, W2>(istream&, PairWeight<W1, W2>&); - - typedef PairWeight<typename W1::ReverseWeight, - typename W2::ReverseWeight> - ReverseWeight; - - PairWeight() {} - - PairWeight(const PairWeight& w) : value1_(w.value1_), value2_(w.value2_) {} - - PairWeight(W1 w1, W2 w2) : value1_(w1), value2_(w2) {} - - static const PairWeight<W1, W2> &Zero() { - static const PairWeight<W1, W2> zero(W1::Zero(), W2::Zero()); - return zero; - } - - static const PairWeight<W1, W2> &One() { - static const PairWeight<W1, W2> one(W1::One(), W2::One()); - return one; - } - - static const PairWeight<W1, W2> &NoWeight() { - static const PairWeight<W1, W2> no_weight(W1::NoWeight(), W2::NoWeight()); - return no_weight; - } - - istream &Read(istream &strm) { - value1_.Read(strm); - return value2_.Read(strm); - } - - ostream &Write(ostream &strm) const { - value1_.Write(strm); - return value2_.Write(strm); - } - - PairWeight<W1, W2> &operator=(const PairWeight<W1, W2> &w) { - value1_ = w.Value1(); - value2_ = w.Value2(); - return *this; - } - - bool Member() const { return value1_.Member() && value2_.Member(); } - - size_t Hash() const { - size_t h1 = value1_.Hash(); - size_t h2 = value2_.Hash(); - const int lshift = 5; - const int rshift = CHAR_BIT * sizeof(size_t) - 5; - return h1 << lshift ^ h1 >> rshift ^ h2; - } - - PairWeight<W1, W2> Quantize(float delta = kDelta) const { - return PairWeight<W1, W2>(value1_.Quantize(delta), - value2_.Quantize(delta)); - } - - ReverseWeight Reverse() const { - return ReverseWeight(value1_.Reverse(), value2_.Reverse()); - } - - const W1& Value1() const { return value1_; } - - const W2& Value2() const { return value2_; } - - protected: - void SetValue1(const W1 &w) { value1_ = w; } - void SetValue2(const W2 &w) { value2_ = w; } - - // Reads PairWeight when there are not parentheses around pair terms - inline static istream &ReadNoParen( - istream &strm, PairWeight<W1, W2>& w, char separator) { - int c; - do { - c = strm.get(); - } while (isspace(c)); - - string s1; - while (c != separator) { - if (c == EOF) { - strm.clear(std::ios::badbit); - return strm; - } - s1 += c; - c = strm.get(); - } - istringstream strm1(s1); - W1 w1 = W1::Zero(); - strm1 >> w1; - - // read second element - W2 w2 = W2::Zero(); - strm >> w2; - - w = PairWeight<W1, W2>(w1, w2); - return strm; - } - - // Reads PairWeight when there are parentheses around pair terms - inline static istream &ReadWithParen( - istream &strm, PairWeight<W1, W2>& w, - char separator, char open_paren, char close_paren) { - int c; - do { - c = strm.get(); - } while (isspace(c)); - if (c != open_paren) { - FSTERROR() << " is fst_weight_parentheses flag set correcty? "; - strm.clear(std::ios::failbit); - return strm; - } - c = strm.get(); - - // read first element - stack<int> parens; - string s1; - while (c != separator || !parens.empty()) { - if (c == EOF) { - strm.clear(std::ios::badbit); - return strm; - } - s1 += c; - // if parens encountered before separator, they must be matched - if (c == open_paren) { - parens.push(1); - } else if (c == close_paren) { - // Fail for mismatched parens - if (parens.empty()) { - strm.clear(std::ios::failbit); - return strm; - } - parens.pop(); - } - c = strm.get(); - } - istringstream strm1(s1); - W1 w1 = W1::Zero(); - strm1 >> w1; - - // read second element - string s2; - c = strm.get(); - while (c != EOF) { - s2 += c; - c = strm.get(); - } - if (s2.empty() || (s2[s2.size() - 1] != close_paren)) { - FSTERROR() << " is fst_weight_parentheses flag set correcty? "; - strm.clear(std::ios::failbit); - return strm; - } - - s2.erase(s2.size() - 1, 1); - istringstream strm2(s2); - W2 w2 = W2::Zero(); - strm2 >> w2; - - w = PairWeight<W1, W2>(w1, w2); - return strm; - } - - private: - W1 value1_; - W2 value2_; - -}; - -template <class W1, class W2> -inline bool operator==(const PairWeight<W1, W2> &w, - const PairWeight<W1, W2> &v) { - return w.Value1() == v.Value1() && w.Value2() == v.Value2(); -} - -template <class W1, class W2> -inline bool operator!=(const PairWeight<W1, W2> &w1, - const PairWeight<W1, W2> &w2) { - return w1.Value1() != w2.Value1() || w1.Value2() != w2.Value2(); -} - - -template <class W1, class W2> -inline bool ApproxEqual(const PairWeight<W1, W2> &w1, - const PairWeight<W1, W2> &w2, - float delta = kDelta) { - return ApproxEqual(w1.Value1(), w2.Value1(), delta) && - ApproxEqual(w1.Value2(), w2.Value2(), delta); -} - -template <class W1, class W2> -inline ostream &operator<<(ostream &strm, const PairWeight<W1, W2> &w) { - if(FLAGS_fst_weight_separator.size() != 1) { - FSTERROR() << "FLAGS_fst_weight_separator.size() is not equal to 1"; - strm.clear(std::ios::badbit); - return strm; - } - char separator = FLAGS_fst_weight_separator[0]; - if (FLAGS_fst_weight_parentheses.empty()) - return strm << w.Value1() << separator << w.Value2(); - - if (FLAGS_fst_weight_parentheses.size() != 2) { - FSTERROR() << "FLAGS_fst_weight_parentheses.size() is not equal to 2"; - strm.clear(std::ios::badbit); - return strm; - } - char open_paren = FLAGS_fst_weight_parentheses[0]; - char close_paren = FLAGS_fst_weight_parentheses[1]; - return strm << open_paren << w.Value1() << separator - << w.Value2() << close_paren ; -} - -template <class W1, class W2> -inline istream &operator>>(istream &strm, PairWeight<W1, W2> &w) { - if(FLAGS_fst_weight_separator.size() != 1) { - FSTERROR() << "FLAGS_fst_weight_separator.size() is not equal to 1"; - strm.clear(std::ios::badbit); - return strm; - } - char separator = FLAGS_fst_weight_separator[0]; - bool read_parens = !FLAGS_fst_weight_parentheses.empty(); - if (read_parens) { - if (FLAGS_fst_weight_parentheses.size() != 2) { - FSTERROR() << "FLAGS_fst_weight_parentheses.size() is not equal to 2"; - strm.clear(std::ios::badbit); - return strm; - } - return PairWeight<W1, W2>::ReadWithParen( - strm, w, separator, FLAGS_fst_weight_parentheses[0], - FLAGS_fst_weight_parentheses[1]); - } else { - return PairWeight<W1, W2>::ReadNoParen(strm, w, separator); - } -} - -} // namespace fst - -#endif // FST_LIB_PAIR_WEIGHT_H_ |