20 #ifndef FST_EXTENSIONS_MPDT_INFO_H_ 21 #define FST_EXTENSIONS_MPDT_INFO_H_ 35 #include <unordered_map> 36 #include <unordered_set> 41 template <
class Arc,
typename Arc::Label nlevels = 2>
44 using Label =
typename Arc::Label;
49 const std::vector<std::pair<Label, Label>> &parens,
50 const std::vector<Label> &assignments);
52 const std::string &
FstType()
const {
return fst_type_; }
54 const std::string &
ArcType()
const {
return Arc::Type(); }
58 int64_t
NumArcs()
const {
return narcs_; }
67 return nuniq_open_parens_[level];
71 return nuniq_close_parens_[level];
74 return nopen_paren_states_[level];
78 return nclose_paren_states_[level];
84 std::string fst_type_;
87 int64_t nopen_parens_[nlevels];
88 int64_t nclose_parens_[nlevels];
89 int64_t nuniq_open_parens_[nlevels];
90 int64_t nuniq_close_parens_[nlevels];
91 int64_t nopen_paren_states_[nlevels];
92 int64_t nclose_paren_states_[nlevels];
96 template <
class Arc,
typename Arc::Label nlevels>
99 const std::vector<std::pair<typename Arc::Label, typename Arc::Label>>
101 const std::vector<typename Arc::Label> &assignments)
102 : fst_type_(fst.Type()), nstates_(0), narcs_(0), error_(false) {
103 std::unordered_map<Label, size_t> paren_map;
104 std::unordered_set<Label> paren_set;
105 std::unordered_map<Label, int> paren_levels;
106 std::unordered_set<StateId> open_paren_state_set;
107 std::unordered_set<StateId> close_paren_state_set;
108 if (parens.size() != assignments.size()) {
109 FSTERROR() <<
"MPdtInfo: Parens of different size from assignments";
113 for (
Label i = 0; i < assignments.size(); ++i) {
116 Label level = assignments[i] - 1;
117 if (level < 0 || level >= nlevels) {
118 FSTERROR() <<
"MPdtInfo: Specified level " << level <<
" out of bounds";
122 const auto &pair = parens[i];
123 paren_levels[pair.first] = level;
124 paren_levels[pair.second] = level;
125 paren_map[pair.first] = i;
126 paren_map[pair.second] = i;
128 for (
Label i = 0; i < nlevels; ++i) {
129 nopen_parens_[i] = 0;
130 nclose_parens_[i] = 0;
131 nuniq_open_parens_[i] = 0;
132 nuniq_close_parens_[i] = 0;
133 nopen_paren_states_[i] = 0;
134 nclose_paren_states_[i] = 0;
138 const auto s = siter.Value();
140 const auto &arc = aiter.Value();
142 const auto it = paren_map.find(arc.ilabel);
143 if (it != paren_map.end()) {
144 const auto open_paren = parens[it->second].first;
145 const auto close_paren = parens[it->second].second;
146 const auto level = paren_levels[arc.ilabel];
147 if (arc.ilabel == open_paren) {
148 ++nopen_parens_[level];
149 if (paren_set.insert(open_paren).second) {
150 ++nuniq_open_parens_[level];
152 if (open_paren_state_set.insert(arc.nextstate).second) {
153 ++nopen_paren_states_[level];
156 ++nclose_parens_[level];
157 if (paren_set.insert(close_paren).second) {
158 ++nuniq_close_parens_[level];
160 if (close_paren_state_set.insert(s).second) {
161 ++nclose_paren_states_[level];
169 template <
class Arc,
typename Arc::Label nlevels>
171 const auto old = std::cout.setf(std::ios::left);
173 std::cout <<
"fst type" <<
FstType() << std::endl;
175 std::cout <<
"arc type" <<
ArcType() << std::endl;
177 std::cout <<
"# of states" <<
NumStates() << std::endl;
179 std::cout <<
"# of arcs" <<
NumArcs() << std::endl;
181 std::cout <<
"# of levels" <<
NumLevels() << std::endl;
183 for (
typename Arc::Label i = 0; i < nlevels; ++i) {
185 std::cout <<
"# of open parentheses at level " << level <<
"\t" 188 std::cout <<
"# of close parentheses at level " << level <<
"\t" 191 std::cout <<
"# of unique open parentheses at level " << level <<
"\t" 194 std::cout <<
"# of unique close parentheses at level " << level <<
"\t" 197 std::cout <<
"# of open parenthesis dest. states at level " << level <<
"\t" 200 std::cout <<
"# of close parenthesis source states at level " << level
209 #endif // FST_EXTENSIONS_MPDT_INFO_H_ MPdtInfo(const Fst< Arc > &fst, const std::vector< std::pair< Label, Label >> &parens, const std::vector< Label > &assignments)
int64_t NumOpenParens(Label level) const
typename Arc::Weight Weight
int64_t NumStates() const
typename Arc::Label Label
int64_t NumLevels() const
int64_t NumCloseParens(Label level) const
int64_t NumUniqueOpenParens(Label level) const
const std::string & FstType() const
typename Arc::StateId StateId
const std::string & ArcType() const
int64_t NumCloseParenStates(Label level) const
int64_t NumOpenParenStates(Label level) const
int64_t NumUniqueCloseParens(Label level) const