20 #ifndef FST_EXTENSIONS_PDT_PDT_H_ 21 #define FST_EXTENSIONS_PDT_PDT_H_ 30 #include <unordered_map> 37 template <
typename StackId,
typename Label>
50 StackNode(StackId p,
size_t i) : parent_id(p), paren_id(i) {}
53 explicit PdtStack(
const std::vector<std::pair<Label, Label>> &parens)
55 for (
size_t i = 0; i < parens.size(); ++i) {
56 const auto &pair = parens[i];
57 paren_map_[pair.first] = i;
58 paren_map_[pair.second] = i;
59 if (min_paren_ ==
kNoLabel || pair.first < min_paren_) {
60 min_paren_ = pair.first;
62 if (pair.second < min_paren_) min_paren_ = pair.second;
63 if (max_paren_ ==
kNoLabel || pair.first > max_paren_) {
64 max_paren_ = pair.first;
66 if (pair.second > max_paren_) max_paren_ = pair.second;
77 StackId
Find(StackId stack_id, Label label) {
78 if (min_paren_ ==
kNoLabel || label < min_paren_ || label > max_paren_) {
81 const auto it = paren_map_.find(label);
83 if (it == paren_map_.end())
return stack_id;
86 if (label == parens_[
paren_id].first) {
87 auto &child_id = child_map_[std::make_pair(stack_id, label)];
89 child_id = nodes_.size();
94 const auto &node = nodes_[stack_id];
96 if (
paren_id == node.paren_id)
return node.parent_id;
103 StackId
Pop(StackId stack_id)
const {
return nodes_[stack_id].parent_id; }
106 ssize_t
Top(StackId stack_id)
const {
return nodes_[stack_id].paren_id; }
109 const auto it = paren_map_.find(label);
110 if (it == paren_map_.end())
return -1;
116 size_t operator()(
const std::pair<StackId, Label> &pair)
const {
117 static constexpr
size_t prime = 7853;
118 return static_cast<size_t>(pair.first) +
119 static_cast<size_t>(pair.second) * prime;
123 std::vector<std::pair<Label, Label>> parens_;
124 std::vector<StackNode> nodes_;
125 std::unordered_map<Label, size_t> paren_map_;
127 std::unordered_map<std::pair<StackId, Label>, StackId, ChildHash> child_map_;
133 template <
typename S,
typename K>
142 : state_id(state_id), stack_id(stack_id) {}
146 template <
typename S,
typename K>
149 if (&x == &y)
return true;
158 static constexpr
auto prime = 7853;
159 return tuple.state_id + tuple.stack_id * prime;
164 template <
class StateId,
class StackId>
166 PdtStateTuple<StateId, StackId>,
167 PdtStateHash<PdtStateTuple<StateId, StackId>>> {
179 #endif // FST_EXTENSIONS_PDT_PDT_H_
PdtStateTuple(StateId state_id=kNoStateId, StackId stack_id=-1)
StackNode(StackId p, size_t i)
PdtStateTable(const PdtStateTable &other)
StackId Pop(StackId stack_id) const
ssize_t ParenId(Label label) const
typename Arc::StateId StateId
StackId Find(StackId stack_id, Label label)
ssize_t Top(StackId stack_id) const
typename Arc::StateId StackId
size_t operator()(const T &tuple) const
bool operator==(const ErrorWeight &, const ErrorWeight &)
PdtStack(const std::vector< std::pair< Label, Label >> &parens)