| #pragma once |
|
|
| #include <vector> |
|
|
| #include <boost/unordered_map.hpp> |
|
|
| #include "moses/Syntax/NonTerminalMap.h" |
| #include "moses/Syntax/PVertex.h" |
| #include "moses/Syntax/SymbolEqualityPred.h" |
| #include "moses/Syntax/SymbolHasher.h" |
| #include "moses/Word.h" |
|
|
| namespace Moses |
| { |
| namespace Syntax |
| { |
| namespace S2T |
| { |
|
|
| class PChart |
| { |
| public: |
| struct Cell { |
| typedef boost::unordered_map<Word, PVertex, SymbolHasher, |
| SymbolEqualityPred> TMap; |
| typedef NonTerminalMap<PVertex> NMap; |
| |
| TMap terminalVertices; |
| |
| NMap nonTerminalVertices; |
| }; |
|
|
| struct CompressedItem { |
| std::size_t end; |
| const PVertex *vertex; |
| }; |
|
|
| typedef std::vector<std::vector<CompressedItem> > CompressedMatrix; |
|
|
| PChart(std::size_t width, bool maintainCompressedChart); |
|
|
| ~PChart(); |
|
|
| std::size_t GetWidth() const { |
| return m_cells.size(); |
| } |
|
|
| const Cell &GetCell(std::size_t start, std::size_t end) const { |
| return m_cells[start][end]; |
| } |
|
|
| |
| PVertex &AddVertex(const PVertex &v) { |
| const std::size_t start = v.span.GetStartPos(); |
| const std::size_t end = v.span.GetEndPos(); |
| Cell &cell = m_cells[start][end]; |
| |
| if (!v.symbol.IsNonTerminal()) { |
| Cell::TMap::value_type x(v.symbol, v); |
| std::pair<Cell::TMap::iterator, bool> ret = |
| cell.terminalVertices.insert(x); |
| return ret.first->second; |
| } |
| |
| |
| std::pair<Cell::NMap::Iterator, bool> result = |
| cell.nonTerminalVertices.Insert(v.symbol, v); |
| if (result.second && m_compressedChart) { |
| CompressedItem item; |
| item.end = end; |
| item.vertex = &(result.first->second); |
| (*m_compressedChart)[start][v.symbol[0]->GetId()].push_back(item); |
| } |
| return result.first->second; |
| } |
|
|
| const CompressedMatrix &GetCompressedMatrix(std::size_t start) const { |
| return (*m_compressedChart)[start]; |
| } |
|
|
| private: |
| typedef std::vector<CompressedMatrix> CompressedChart; |
|
|
| std::vector<std::vector<Cell> > m_cells; |
| CompressedChart *m_compressedChart; |
| }; |
|
|
| } |
| } |
| } |
|
|