20 #ifndef FST_EXTENSIONS_PDT_PDT_H_ 21 #define FST_EXTENSIONS_PDT_PDT_H_ 23 #include <sys/types.h> 35 #include <unordered_map> 42 template <
typename StackId,
typename Label>
55 StackNode(StackId p,
size_t i) : parent_id(p), paren_id(i) {}
58 explicit PdtStack(
const std::vector<std::pair<Label, Label>> &parens)
60 for (
size_t i = 0; i < parens.size(); ++i) {
61 const auto &pair = parens[i];
62 paren_map_[pair.first] = i;
63 paren_map_[pair.second] = i;
64 if (min_paren_ ==
kNoLabel || pair.first < min_paren_) {
65 min_paren_ = pair.first;
67 if (pair.second < min_paren_) min_paren_ = pair.second;
68 if (max_paren_ ==
kNoLabel || pair.first > max_paren_) {
69 max_paren_ = pair.first;
71 if (pair.second > max_paren_) max_paren_ = pair.second;
82 StackId
Find(StackId stack_id, Label label) {
83 if (min_paren_ ==
kNoLabel || label < min_paren_ || label > max_paren_) {
86 const auto it = paren_map_.find(label);
88 if (it == paren_map_.end())
return stack_id;
91 if (label == parens_[
paren_id].first) {
92 auto &child_id = child_map_[std::make_pair(stack_id, label)];
94 child_id = nodes_.size();
99 const auto &node = nodes_[stack_id];
101 if (
paren_id == node.paren_id)
return node.parent_id;
108 StackId
Pop(StackId stack_id)
const {
return nodes_[stack_id].parent_id; }
111 ssize_t
Top(StackId stack_id)
const {
return nodes_[stack_id].paren_id; }
114 const auto it = paren_map_.find(label);
115 if (it == paren_map_.end())
return -1;
121 size_t operator()(
const std::pair<StackId, Label> &pair)
const {
122 static constexpr
size_t prime = 7853;
123 return static_cast<size_t>(pair.first) +
124 static_cast<size_t>(pair.second) * prime;
128 std::vector<std::pair<Label, Label>> parens_;
129 std::vector<StackNode> nodes_;
130 std::unordered_map<Label, size_t> paren_map_;
132 std::unordered_map<std::pair<StackId, Label>, StackId, ChildHash> child_map_;
138 template <
typename S,
typename K>
147 : state_id(state_id), stack_id(stack_id) {}
151 template <
typename S,
typename K>
154 if (&x == &y)
return true;
163 static constexpr
auto prime = 7853;
164 return tuple.state_id + tuple.stack_id * prime;
169 template <
class StateId,
class StackId>
171 PdtStateTuple<StateId, StackId>,
172 PdtStateHash<PdtStateTuple<StateId, StackId>>> {
184 #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)