| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #pragma once |
|
|
| #include "StackLattice.h" |
| #include "VarSpanNode.h" |
| #include "moses/StackVec.h" |
|
|
| #include <vector> |
|
|
| namespace Moses |
| { |
|
|
| class ChartHypothesisCollection; |
|
|
| template<typename MatchCallBackType> |
| class StackLatticeSearcher |
| { |
| public: |
| StackLatticeSearcher(const StackLattice &lattice, |
| const std::vector<VarSpanNode::NonTermRange> &ranges) |
| : m_lattice(lattice) |
| , m_ranges(ranges) {} |
|
|
| void Search(const std::vector<int> &labels, MatchCallBackType &callback) { |
| m_labels = &labels; |
| m_matchCB = &callback; |
| SearchInner(0, 0); |
| } |
|
|
| private: |
| void SearchInner(int start, size_t index) { |
| assert(m_stackVec.size() == index); |
|
|
| const VarSpanNode::NonTermRange &range = m_ranges[index]; |
|
|
| const size_t offset = (range.s1 == range.s2) ? range.s1 : start; |
|
|
| const size_t minSpan = std::max(offset, range.e1) - offset + 1; |
| const size_t maxSpan = range.e2 - offset + 1; |
|
|
| |
| const std::vector<StackVec> &spanVec = m_lattice[offset][index]; |
|
|
| for (size_t j = minSpan; j <= maxSpan; ++j) { |
| const ChartCellLabel *stack = spanVec[j][(*m_labels)[index]]; |
| if (!stack) { |
| continue; |
| } |
| m_stackVec.push_back(stack); |
| if (index+1 == m_labels->size()) { |
| (*m_matchCB)(m_stackVec); |
| } else { |
| SearchInner(offset+j, index+1); |
| } |
| m_stackVec.pop_back(); |
| } |
| } |
|
|
| const StackLattice &m_lattice; |
| const std::vector<VarSpanNode::NonTermRange> &m_ranges; |
| const std::vector<int> *m_labels; |
| MatchCallBackType *m_matchCB; |
| StackVec m_stackVec; |
| }; |
|
|
| } |
|
|