|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "LRModel.h" |
|
#include "../../legacy/Util2.h" |
|
#include "../../legacy/Range.h" |
|
#include "../../legacy/Bitmap.h" |
|
#include "../../MemPool.h" |
|
#include "util/exception.hh" |
|
#include "PhraseBasedReorderingState.h" |
|
#include "BidirectionalReorderingState.h" |
|
#include "HReorderingBackwardState.h" |
|
#include "HReorderingForwardState.h" |
|
|
|
using namespace std; |
|
|
|
namespace Moses2 |
|
{ |
|
|
|
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))); |
|
} |
|
|
|
LRModel::LRModel(const std::string &modelType, LexicalReordering &ff) : |
|
m_modelType(None), m_phraseBased(true), m_collapseScores(false), m_direction( |
|
Backward), m_scoreProducer(&ff) |
|
{ |
|
std::vector<std::string> config = Tokenize(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); |
|
} |
|
|
|
} |
|
|
|
LRModel::~LRModel() |
|
{ |
|
|
|
} |
|
|
|
size_t LRModel::GetNumberOfTypes() const |
|
{ |
|
return ((m_modelType == MSD) ? 3 : (m_modelType == MSLR) ? 4 : 2); |
|
} |
|
|
|
|
|
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); |
|
} |
|
|
|
LRState *LRModel::CreateLRState(MemPool &pool) const |
|
{ |
|
LRState *bwd = NULL, *fwd = NULL; |
|
size_t offset = 0; |
|
|
|
switch (m_direction) { |
|
case Backward: |
|
case Bidirectional: |
|
if (m_phraseBased) { |
|
bwd = |
|
new (pool.Allocate<PhraseBasedReorderingState>()) PhraseBasedReorderingState( |
|
*this, Backward, offset); |
|
|
|
} else { |
|
bwd = |
|
new (pool.Allocate<HReorderingBackwardState>()) HReorderingBackwardState( |
|
pool, *this, offset); |
|
} |
|
offset += m_collapseScores ? 1 : GetNumberOfTypes(); |
|
if (m_direction == Backward) return bwd; |
|
case Forward: |
|
if (m_phraseBased) { |
|
fwd = |
|
new (pool.Allocate<PhraseBasedReorderingState>()) PhraseBasedReorderingState( |
|
*this, Forward, offset); |
|
|
|
} else { |
|
fwd = |
|
new (pool.Allocate<HReorderingForwardState>()) HReorderingForwardState( |
|
*this, offset); |
|
} |
|
offset += m_collapseScores ? 1 : GetNumberOfTypes(); |
|
if (m_direction == Forward) return fwd; |
|
} |
|
|
|
|
|
BidirectionalReorderingState *ret = |
|
new (pool.Allocate<BidirectionalReorderingState>()) BidirectionalReorderingState( |
|
*this, bwd, fwd, 0); |
|
return ret; |
|
} |
|
|
|
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); |
|
} |
|
|
|
} |
|
|