File size: 2,731 Bytes
158b61b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
#pragma once
#include <vector>
#include <iostream>
#include <boost/functional/hash/hash.hpp>
#include "../legacy/Range.h"
#include "../HypothesisColl.h"
namespace Moses2
{
class System;
class PhraseTable;
namespace SCFG
{
class InputPath;
class Word;
////////////////////////////////////////////////////////////////////////////
//! The range covered by each symbol in the source
//! Terminals will cover only 1 word, NT can cover multiple words
class SymbolBindElement
{
public:
const SCFG::Word *word; // can be term or non-term
const Moses2::Hypotheses *hypos; // NULL if terminal
SymbolBindElement();
SymbolBindElement(const Moses2::Range &range, const SCFG::Word &word, const Moses2::Hypotheses *hypos);
const Range &GetRange() const {
return *m_range;
}
bool operator==(const SymbolBindElement &compare) const {
bool ret = hypos == compare.hypos
&& word == compare.word;
return ret;
}
std::string Debug(const System &system) const;
protected:
const Moses2::Range *m_range;
};
size_t hash_value(const SymbolBindElement &obj);
////////////////////////////////////////////////////////////////////////////
class SymbolBind
{
public:
typedef Vector<SymbolBindElement> Coll;
Coll coll;
size_t numNT;
SymbolBind(MemPool &pool);
SymbolBind(MemPool &pool, const SymbolBind ©)
:coll(copy.coll)
,numNT(copy.numNT)
{}
size_t GetSize() const {
return coll.size();
}
std::vector<const SymbolBindElement*> GetNTElements() const;
void Add(const Range &range, const SCFG::Word &word, const Moses2::Hypotheses *hypos);
bool operator==(const SymbolBind &compare) const {
return coll == compare.coll;
}
std::string Debug(const System &system) const;
};
inline size_t hash_value(const SymbolBind &obj)
{
return boost::hash_value(obj.coll);
}
////////////////////////////////////////////////////////////////////////////
class ActiveChartEntry
{
public:
ActiveChartEntry(MemPool &pool);
ActiveChartEntry(MemPool &pool, const ActiveChartEntry &prevEntry)
:m_symbolBind(pool, prevEntry.GetSymbolBind()) {
//symbolBinds = new (pool.Allocate<SymbolBind>()) SymbolBind(pool, *prevEntry.symbolBinds);
}
const SymbolBind &GetSymbolBind() const {
return m_symbolBind;
}
virtual void AddSymbolBindElement(
const Range &range,
const SCFG::Word &word,
const Moses2::Hypotheses *hypos,
const PhraseTable &pt) {
m_symbolBind.Add(range, word, hypos);
}
protected:
SymbolBind m_symbolBind;
};
////////////////////////////////////////////////////////////////////////////
class ActiveChart
{
public:
ActiveChart(MemPool &pool);
~ActiveChart();
Vector<ActiveChartEntry*> entries;
};
}
}
|