20 #ifndef FST_EXTENSIONS_MPDT_REVERSE_H_ 21 #define FST_EXTENSIONS_MPDT_REVERSE_H_ 33 template <
class Arc,
class RevArc>
36 const std::vector<std::pair<typename Arc::Label, typename Arc::Label>>
39 using Label =
typename Arc::Label;
43 std::vector<std::pair<Label, Label>> relabel_pairs;
44 relabel_pairs.reserve(2 * parens.size());
45 for (
const auto &pair : parens) {
46 relabel_pairs.emplace_back(pair.first, pair.second);
47 relabel_pairs.emplace_back(pair.second, pair.first);
49 Relabel(ofst, relabel_pairs, relabel_pairs);
52 Label min_level = std::numeric_limits<Label>::max();
53 for (
const auto assignment : *assignments) {
54 if (assignment < min_level) {
55 min_level = assignment;
56 }
else if (assignment > max_level) {
57 max_level = assignment;
61 for (
auto &assignment : *assignments) {
62 assignment = (max_level - assignment) + min_level;
68 #endif // FST_EXTENSIONS_MPDT_REVERSE_H_
void Relabel(MutableFst< Arc > *fst, const std::vector< std::pair< typename Arc::Label, typename Arc::Label >> &ipairs, const std::vector< std::pair< typename Arc::Label, typename Arc::Label >> &opairs)
void Reverse(const Fst< Arc > &ifst, const std::vector< std::pair< typename Arc::Label, typename Arc::Label >> &parens, std::vector< typename Arc::Label > *assignments, MutableFst< RevArc > *ofst)