|
#include "LRModel.h" |
|
#include "moses/Range.h" |
|
#include "moses/Bitmap.h" |
|
#include "moses/InputType.h" |
|
#include "HReorderingForwardState.h" |
|
#include "HReorderingBackwardState.h" |
|
#include "PhraseBasedReorderingState.h" |
|
#include "BidirectionalReorderingState.h" |
|
#include "SparseReordering.h" |
|
|
|
namespace Moses |
|
{ |
|
|
|
bool |
|
IsMonotonicStep(Range const& prev, |
|
Range const& cur, |
|
Bitmap const& cov) |
|
{ |
|
size_t e = prev.GetEndPos() + 1; |
|
size_t s = cur.GetStartPos(); |
|
return (s == e || (s >= e && !cov.GetValue(e))); |
|
} |
|
|
|
bool |
|
IsSwap(Range const& prev, Range const& cur, Bitmap const& cov) |
|
{ |
|
size_t s = prev.GetStartPos(); |
|
size_t e = cur.GetEndPos(); |
|
return (e+1 == s || (e < s && !cov.GetValue(s-1))); |
|
} |
|
|
|
size_t |
|
LRModel:: |
|
GetNumberOfTypes() const |
|
{ |
|
return ((m_modelType == MSD) ? 3 : |
|
(m_modelType == MSLR) ? 4 : 2); |
|
} |
|
|
|
size_t |
|
LRModel:: |
|
GetNumScoreComponents() const |
|
{ |
|
size_t score_per_dir = m_collapseScores ? 1 : GetNumberOfTypes(); |
|
return ((m_direction == Bidirectional) |
|
? 2 * score_per_dir + m_additionalScoreComponents |
|
: score_per_dir + m_additionalScoreComponents); |
|
} |
|
|
|
void |
|
LRModel:: |
|
ConfigureSparse(const std::map<std::string,std::string>& sparseArgs, |
|
const LexicalReordering* producer) |
|
{ |
|
if (sparseArgs.size()) { |
|
m_sparse.reset(new SparseReordering(sparseArgs, producer)); |
|
} |
|
} |
|
|
|
void |
|
LRModel:: |
|
SetAdditionalScoreComponents(size_t number) |
|
{ |
|
m_additionalScoreComponents = number; |
|
} |
|
|
|
|
|
LRModel::ReorderingType |
|
LRModel:: |
|
GetOrientation(Range const& cur) const |
|
{ |
|
UTIL_THROW_IF2(m_modelType == None, "Reordering Model Type is None"); |
|
return ((m_modelType == LeftRight) ? R : |
|
(cur.GetStartPos() == 0) ? M : |
|
(m_modelType == MSD) ? D : |
|
(m_modelType == MSLR) ? DR : NM); |
|
} |
|
|
|
LRModel::ReorderingType |
|
LRModel:: |
|
GetOrientation(Range const& prev, Range const& cur) const |
|
{ |
|
UTIL_THROW_IF2(m_modelType == None, "No reordering model type specified"); |
|
return ((m_modelType == LeftRight) |
|
? prev.GetEndPos() <= cur.GetStartPos() ? R : L |
|
: (cur.GetStartPos() == prev.GetEndPos() + 1) ? M |
|
: (m_modelType == Monotonic) ? NM |
|
: (prev.GetStartPos() == cur.GetEndPos() + 1) ? S |
|
: (m_modelType == MSD) ? D |
|
: (cur.GetStartPos() > prev.GetEndPos()) ? DR : DL); |
|
} |
|
|
|
LRModel::ReorderingType |
|
LRModel:: |
|
GetOrientation(int const reoDistance) const |
|
{ |
|
|
|
return ((m_modelType == LeftRight) |
|
? (reoDistance >= 1) ? R : L |
|
: (reoDistance == 1) ? M |
|
: (m_modelType == Monotonic) ? NM |
|
: (reoDistance == -1) ? S |
|
: (m_modelType == MSD) ? D |
|
: (reoDistance > 1) ? DR : DL); |
|
} |
|
|
|
LRModel::ReorderingType |
|
LRModel:: |
|
GetOrientation(Range const& prev, Range const& cur, |
|
Bitmap const& cov) const |
|
{ |
|
return ((m_modelType == LeftRight) |
|
? cur.GetStartPos() > prev.GetEndPos() ? R : L |
|
: IsMonotonicStep(prev,cur,cov) ? M |
|
: (m_modelType == Monotonic) ? NM |
|
: IsSwap(prev,cur,cov) ? S |
|
: (m_modelType == MSD) ? D |
|
: cur.GetStartPos() > prev.GetEndPos() ? DR : DL); |
|
} |
|
|
|
LRModel:: |
|
LRModel(const std::string &modelType) |
|
: m_modelString(modelType) |
|
, m_scoreProducer(NULL) |
|
, m_modelType(None) |
|
, m_phraseBased(true) |
|
, m_collapseScores(false) |
|
, m_direction(Backward) |
|
, m_additionalScoreComponents(0) |
|
{ |
|
std::vector<std::string> config = Tokenize<std::string>(modelType, "-"); |
|
|
|
for (size_t i=0; i<config.size(); ++i) { |
|
if (config[i] == "hier") { |
|
m_phraseBased = false; |
|
} else if (config[i] == "phrase") { |
|
m_phraseBased = true; |
|
} else if (config[i] == "wbe") { |
|
m_phraseBased = true; |
|
} |
|
|
|
|
|
|
|
else if (config[i] == "msd") { |
|
m_modelType = MSD; |
|
} else if (config[i] == "mslr") { |
|
m_modelType = MSLR; |
|
} else if (config[i] == "monotonicity") { |
|
m_modelType = Monotonic; |
|
} else if (config[i] == "leftright") { |
|
m_modelType = LeftRight; |
|
} |
|
|
|
|
|
else if (config[i] == "unidirectional") { |
|
m_direction = Backward; |
|
} else if (config[i] == "backward") { |
|
m_direction = Backward; |
|
} else if (config[i] == "forward") { |
|
m_direction = Forward; |
|
} else if (config[i] == "bidirectional") { |
|
m_direction = Bidirectional; |
|
} |
|
|
|
else if (config[i] == "f") { |
|
m_condition = F; |
|
} else if (config[i] == "fe") { |
|
m_condition = FE; |
|
} |
|
|
|
else if (config[i] == "collapseff") { |
|
m_collapseScores = true; |
|
} else if (config[i] == "allff") { |
|
m_collapseScores = false; |
|
} else { |
|
std::cerr |
|
<< "Illegal part in the lexical reordering configuration string: " |
|
<< config[i] << std::endl; |
|
exit(1); |
|
} |
|
} |
|
|
|
if (m_modelType == None) { |
|
std::cerr |
|
<< "You need to specify the type of the reordering model " |
|
<< "(msd, monotonicity,...)" << std::endl; |
|
exit(1); |
|
} |
|
} |
|
|
|
LRState * |
|
LRModel:: |
|
CreateLRState(const InputType &input) const |
|
{ |
|
LRState *bwd = NULL, *fwd = NULL; |
|
size_t offset = 0; |
|
|
|
switch(m_direction) { |
|
case Backward: |
|
case Bidirectional: |
|
if (m_phraseBased) |
|
bwd = new PhraseBasedReorderingState(*this, Backward, offset); |
|
else |
|
bwd = new HReorderingBackwardState(*this, offset); |
|
offset += m_collapseScores ? 1 : GetNumberOfTypes(); |
|
if (m_direction == Backward) return bwd; |
|
case Forward: |
|
if (m_phraseBased) |
|
fwd = new PhraseBasedReorderingState(*this, Forward, offset); |
|
else |
|
fwd = new HReorderingForwardState(*this, input.GetSize(), offset); |
|
offset += m_collapseScores ? 1 : GetNumberOfTypes(); |
|
if (m_direction == Forward) return fwd; |
|
} |
|
return new BidirectionalReorderingState(*this, bwd, fwd, 0); |
|
} |
|
|
|
} |
|
|
|
|