00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #pragma once
00021
00022 #include "StackLattice.h"
00023 #include "VarSpanNode.h"
00024 #include "moses/StackVec.h"
00025
00026 #include <vector>
00027
00028 namespace Moses
00029 {
00030
00031 class ChartHypothesisCollection;
00032
00033 template<typename MatchCallBackType>
00034 class StackLatticeSearcher
00035 {
00036 public:
00037 StackLatticeSearcher(const StackLattice &lattice,
00038 const std::vector<VarSpanNode::NonTermRange> &ranges)
00039 : m_lattice(lattice)
00040 , m_ranges(ranges) {}
00041
00042 void Search(const std::vector<int> &labels, MatchCallBackType &callback) {
00043 m_labels = &labels;
00044 m_matchCB = &callback;
00045 SearchInner(0, 0);
00046 }
00047
00048 private:
00049 void SearchInner(int start, size_t index) {
00050 assert(m_stackVec.size() == index);
00051
00052 const VarSpanNode::NonTermRange &range = m_ranges[index];
00053
00054 const size_t offset = (range.s1 == range.s2) ? range.s1 : start;
00055
00056 const size_t minSpan = std::max(offset, range.e1) - offset + 1;
00057 const size_t maxSpan = range.e2 - offset + 1;
00058
00059
00060 const std::vector<StackVec> &spanVec = m_lattice[offset][index];
00061
00062 for (size_t j = minSpan; j <= maxSpan; ++j) {
00063 const ChartCellLabel *stack = spanVec[j][(*m_labels)[index]];
00064 if (!stack) {
00065 continue;
00066 }
00067 m_stackVec.push_back(stack);
00068 if (index+1 == m_labels->size()) {
00069 (*m_matchCB)(m_stackVec);
00070 } else {
00071 SearchInner(offset+j, index+1);
00072 }
00073 m_stackVec.pop_back();
00074 }
00075 }
00076
00077 const StackLattice &m_lattice;
00078 const std::vector<VarSpanNode::NonTermRange> &m_ranges;
00079 const std::vector<int> *m_labels;
00080 MatchCallBackType *m_matchCB;
00081 StackVec m_stackVec;
00082 };
00083
00084 }