20 #ifndef FST_EXTENSIONS_MPDT_INFO_H_ 21 #define FST_EXTENSIONS_MPDT_INFO_H_ 29 #include <unordered_map> 30 #include <unordered_set> 35 template <
class Arc,
typename Arc::Label nlevels = 2>
38 using Label =
typename Arc::Label;
43 const std::vector<std::pair<Label, Label>> &parens,
44 const std::vector<Label> &assignments);
46 const std::string &
FstType()
const {
return fst_type_; }
48 const std::string &
ArcType()
const {
return Arc::Type(); }
52 int64_t
NumArcs()
const {
return narcs_; }
61 return nuniq_open_parens_[level];
65 return nuniq_close_parens_[level];
68 return nopen_paren_states_[level];
72 return nclose_paren_states_[level];
78 std::string fst_type_;
81 int64_t nopen_parens_[nlevels];
82 int64_t nclose_parens_[nlevels];
83 int64_t nuniq_open_parens_[nlevels];
84 int64_t nuniq_close_parens_[nlevels];
85 int64_t nopen_paren_states_[nlevels];
86 int64_t nclose_paren_states_[nlevels];
90 template <
class Arc,
typename Arc::Label nlevels>
93 const std::vector<std::pair<typename Arc::Label, typename Arc::Label>>
95 const std::vector<typename Arc::Label> &assignments)
96 : fst_type_(fst.Type()), nstates_(0), narcs_(0), error_(false) {
97 std::unordered_map<Label, size_t> paren_map;
98 std::unordered_set<Label> paren_set;
99 std::unordered_map<Label, int> paren_levels;
100 std::unordered_set<StateId> open_paren_state_set;
101 std::unordered_set<StateId> close_paren_state_set;
102 if (parens.size() != assignments.size()) {
103 FSTERROR() <<
"MPdtInfo: Parens of different size from assignments";
107 for (
Label i = 0; i < assignments.size(); ++i) {
110 Label level = assignments[i] - 1;
111 if (level < 0 || level >= nlevels) {
112 FSTERROR() <<
"MPdtInfo: Specified level " << level <<
" out of bounds";
116 const auto &pair = parens[i];
117 paren_levels[pair.first] = level;
118 paren_levels[pair.second] = level;
119 paren_map[pair.first] = i;
120 paren_map[pair.second] = i;
122 for (
Label i = 0; i < nlevels; ++i) {
123 nopen_parens_[i] = 0;
124 nclose_parens_[i] = 0;
125 nuniq_open_parens_[i] = 0;
126 nuniq_close_parens_[i] = 0;
127 nopen_paren_states_[i] = 0;
128 nclose_paren_states_[i] = 0;
132 const auto s = siter.Value();
134 const auto &arc = aiter.Value();
136 const auto it = paren_map.find(arc.ilabel);
137 if (it != paren_map.end()) {
138 const auto open_paren = parens[it->second].first;
139 const auto close_paren = parens[it->second].second;
140 const auto level = paren_levels[arc.ilabel];
141 if (arc.ilabel == open_paren) {
142 ++nopen_parens_[level];
143 if (paren_set.insert(open_paren).second) {
144 ++nuniq_open_parens_[level];
146 if (open_paren_state_set.insert(arc.nextstate).second) {
147 ++nopen_paren_states_[level];
150 ++nclose_parens_[level];
151 if (paren_set.insert(close_paren).second) {
152 ++nuniq_close_parens_[level];
154 if (close_paren_state_set.insert(s).second) {
155 ++nclose_paren_states_[level];
163 template <
class Arc,
typename Arc::Label nlevels>
165 const auto old = std::cout.setf(std::ios::left);
167 std::cout <<
"fst type" <<
FstType() << std::endl;
169 std::cout <<
"arc type" <<
ArcType() << std::endl;
171 std::cout <<
"# of states" <<
NumStates() << std::endl;
173 std::cout <<
"# of arcs" <<
NumArcs() << std::endl;
175 std::cout <<
"# of levels" <<
NumLevels() << std::endl;
177 for (
typename Arc::Label i = 0; i < nlevels; ++i) {
179 std::cout <<
"# of open parentheses at level " << level <<
"\t" 182 std::cout <<
"# of close parentheses at level " << level <<
"\t" 185 std::cout <<
"# of unique open parentheses at level " << level <<
"\t" 188 std::cout <<
"# of unique close parentheses at level " << level <<
"\t" 191 std::cout <<
"# of open parenthesis dest. states at level " << level <<
"\t" 194 std::cout <<
"# of close parenthesis source states at level " << level
203 #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