/usr/include/fst/extensions/linear/loglinear-apply.h is in libfst-dev 1.6.3-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 | // See www.openfst.org for extensive documentation on this weighted
// finite-state transducer library.
#ifndef FST_EXTENSIONS_LINEAR_LOGLINEAR_APPLY_H_
#define FST_EXTENSIONS_LINEAR_LOGLINEAR_APPLY_H_
#include <fst/compat.h>
#include <fst/arc.h>
#include <fst/arc-map.h>
#include <fst/compose.h>
#include <fst/determinize.h>
#include <fst/float-weight.h>
#include <fst/fst.h>
#include <fst/minimize.h>
#include <fst/mutable-fst.h>
#include <fst/project.h>
#include <fst/rmepsilon.h>
#include <fst/vector-fst.h>
namespace fst {
// Applies a FST model as a discriminative model to weighted input
// `ifst`. `A` is an arc type with tropical weight of all the
// input/output FSTs.
//
// In general, consider `ifst` an unnormalized probability
// distribution between its input X and output Y, P(X, Y); and `lfst`
// a group of unnormalized probability distributions of all its output
// Z for every input Y, Q(Z|Y). `normalize` controls whether Q is
// normalized for every Y before chaining with P(X, Y). I.e., for a
// path (X, Y, Z) in `ofst` (where Y is hidden),
//
// - When `normalize` is true, its weight is P(X, Y) Q(Z|Y) / sum_z Q(z|Y);
// - When `normalize` is false, its weight is P(X, Y) Q(Z|Y).
template <class A>
void LogLinearApply(const Fst<A> &ifst, const Fst<A> &lfst, MutableFst<A> *ofst,
bool normalize = true) {
LogLinearApply<A, LogArc>(ifst, lfst, ofst, normalize);
}
// This version gives finer control over the arc type (`B`) to be used
// in normalization. `B` is an arc type with log weight (e.g. `LogArc`
// or `Log64Arc`).
template <class A, class B>
void LogLinearApply(const Fst<A> &ifst, const Fst<A> &lfst, MutableFst<A> *ofst,
bool normalize = true) {
if (normalize) {
VectorFst<A> unnormalized_ofst, rescored_ifsa;
Compose(ifst, lfst, &unnormalized_ofst);
{
VectorFst<A> tropical_ifsa(unnormalized_ofst);
Project(&tropical_ifsa, PROJECT_INPUT);
{
VectorFst<B> minimal_log_ifsa;
{
VectorFst<B> log_ifsa;
ArcMap(tropical_ifsa, &log_ifsa, WeightConvertMapper<A, B>());
RmEpsilon(&log_ifsa);
Determinize(log_ifsa, &minimal_log_ifsa);
}
Minimize(&minimal_log_ifsa);
ArcMap(&minimal_log_ifsa, InvertWeightMapper<B>());
ArcMap(minimal_log_ifsa, &tropical_ifsa, WeightConvertMapper<B, A>());
}
ArcSort(&tropical_ifsa, OLabelCompare<A>());
Compose(tropical_ifsa, ifst, &rescored_ifsa);
}
ArcSort(&rescored_ifsa, OLabelCompare<A>());
Compose(rescored_ifsa, unnormalized_ofst, ofst);
} else {
Compose(ifst, lfst, ofst);
}
}
} // namespace fst
#endif // FST_EXTENSIONS_LINEAR_LOGLINEAR_APPLY_H_
|