This file is indexed.

/usr/include/fst/expectation-weight.h is in libfst-dev 1.5.3+r3-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// See www.openfst.org for extensive documentation on this weighted
// finite-state transducer library.
//
// Expectation semiring as described by Jason Eisner:
// See: doi=10.1.1.22.9398
// Multiplex semiring operations and identities:
//    One: <One, Zero>
//    Zero: <Zero, Zero>
//    Plus: <a1, b1> + <a2, b2> = < (a1 + a2) , (b1 + b2) >
//    Times: <a1, b1> * <a2, b2> = < (a1 * a2) , [(a1 * b2) + (a2 * b1)] >
//    Division: Undefined (currently)
//
// Usually used to store the pair <probability, random_variable> so that
// ShortestDistance[Fst<ArcTpl<ExpectationWeight<P, V>>>]
//    == < PosteriorProbability, Expected_Value[V] >

#ifndef FST_LIB_EXPECTATION_WEIGHT_H_
#define FST_LIB_EXPECTATION_WEIGHT_H_

#include <string>

#include <fst/pair-weight.h>


namespace fst {

// X1 is usually a probability weight like LogWeight
// X2 is usually a random variable or vector
//    see SignedLogWeight or SparsePowerWeight
//
// If X1 is distinct from X2, it is required that there is an external
// product between X1 and X2 and if both semriring are commutative, or
// left or right semirings, then result must have those properties.
template <class X1, class X2>
class ExpectationWeight : public PairWeight<X1, X2> {
 public:
  using PairWeight<X1, X2>::Value1;
  using PairWeight<X1, X2>::Value2;

  using PairWeight<X1, X2>::Reverse;
  using PairWeight<X1, X2>::Quantize;
  using PairWeight<X1, X2>::Member;

  typedef X1 W1;
  typedef X2 W2;

  typedef ExpectationWeight<typename X1::ReverseWeight,
                            typename X2::ReverseWeight> ReverseWeight;

  ExpectationWeight() : PairWeight<X1, X2>(Zero()) {}

  ExpectationWeight(const ExpectationWeight<X1, X2> &w)
      : PairWeight<X1, X2>(w) {}

  ExpectationWeight(const PairWeight<X1, X2> &w) : PairWeight<X1, X2>(w) {}

  ExpectationWeight(const X1 &x1, const X2 &x2) : PairWeight<X1, X2>(x1, x2) {}

  static const ExpectationWeight<X1, X2> &Zero() {
    static const ExpectationWeight<X1, X2> zero(X1::Zero(), X2::Zero());
    return zero;
  }

  static const ExpectationWeight<X1, X2> &One() {
    static const ExpectationWeight<X1, X2> one(X1::One(), X2::Zero());
    return one;
  }

  static const ExpectationWeight<X1, X2> &NoWeight() {
    static const ExpectationWeight<X1, X2> no_weight(X1::NoWeight(),
                                                     X2::NoWeight());
    return no_weight;
  }

  static const string &Type() {
    static const string type = "expectation_" + X1::Type() + "_" + X2::Type();
    return type;
  }

  PairWeight<X1, X2> Quantize(float delta = kDelta) const {
    return PairWeight<X1, X2>::Quantize();
  }

  ReverseWeight Reverse() const { return PairWeight<X1, X2>::Reverse(); }

  bool Member() const { return PairWeight<X1, X2>::Member(); }

  static uint64 Properties() {
    uint64 props1 = W1::Properties();
    uint64 props2 = W2::Properties();
    return props1 & props2 &
           (kLeftSemiring | kRightSemiring | kCommutative | kIdempotent);
  }
};

template <class X1, class X2>
inline ExpectationWeight<X1, X2> Plus(const ExpectationWeight<X1, X2> &w,
                                      const ExpectationWeight<X1, X2> &v) {
  return ExpectationWeight<X1, X2>(Plus(w.Value1(), v.Value1()),
                                   Plus(w.Value2(), v.Value2()));
}

template <class X1, class X2>
inline ExpectationWeight<X1, X2> Times(const ExpectationWeight<X1, X2> &w,
                                       const ExpectationWeight<X1, X2> &v) {
  return ExpectationWeight<X1, X2>(
      Times(w.Value1(), v.Value1()),
      Plus(Times(w.Value1(), v.Value2()), Times(w.Value2(), v.Value1())));
}

template <class X1, class X2>
inline ExpectationWeight<X1, X2> Divide(const ExpectationWeight<X1, X2> &w,
                                        const ExpectationWeight<X1, X2> &v,
                                        DivideType typ = DIVIDE_ANY) {
  FSTERROR() << "ExpectationWeight::Divide: Not implemented";
  return ExpectationWeight<X1, X2>::NoWeight();
}

}  // namespace fst

#endif  // FST_LIB_EXPECTATION_WEIGHT_H_