20 #ifndef FST_EXTENSIONS_MPDT_REVERSE_H_ 21 #define FST_EXTENSIONS_MPDT_REVERSE_H_ 35 template <
class Arc,
class RevArc>
38 const std::vector<std::pair<typename Arc::Label, typename Arc::Label>>
41 using Label =
typename Arc::Label;
45 std::vector<std::pair<Label, Label>> relabel_pairs;
46 relabel_pairs.reserve(2 * parens.size());
47 for (
const auto &pair : parens) {
48 relabel_pairs.emplace_back(pair.first, pair.second);
49 relabel_pairs.emplace_back(pair.second, pair.first);
51 Relabel(ofst, relabel_pairs, relabel_pairs);
54 Label min_level = std::numeric_limits<Label>::max();
55 for (
const auto assignment : *assignments) {
56 if (assignment < min_level) {
57 min_level = assignment;
58 }
else if (assignment > max_level) {
59 max_level = assignment;
63 for (
auto &assignment : *assignments) {
64 assignment = (max_level - assignment) + min_level;
70 #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)