mirror of
https://github.com/moses-smt/mosesdecoder.git
synced 2025-01-09 04:56:57 +03:00
111 lines
3.3 KiB
C++
111 lines
3.3 KiB
C++
/*
|
|
* Search.cpp
|
|
*
|
|
* Created on: 16 Nov 2015
|
|
* Author: hieu
|
|
*/
|
|
|
|
#include "Search.h"
|
|
#include "Manager.h"
|
|
#include "../System.h"
|
|
#include "../legacy/Bitmap.h"
|
|
#include "../legacy/Range.h"
|
|
|
|
namespace Moses2
|
|
{
|
|
|
|
Search::Search(Manager &mgr)
|
|
:mgr(mgr)
|
|
{
|
|
// TODO Auto-generated constructor stub
|
|
|
|
}
|
|
|
|
Search::~Search() {
|
|
// TODO Auto-generated destructor stub
|
|
}
|
|
|
|
bool Search::CanExtend(const Bitmap &hypoBitmap, size_t hypoRangeEndPos, const Range &pathRange)
|
|
{
|
|
const size_t hypoFirstGapPos = hypoBitmap.GetFirstGapPos();
|
|
|
|
//cerr << "DOING " << hypoBitmap << " [" << hypoRange.GetStartPos() << " " << hypoRange.GetEndPos() << "]"
|
|
// " [" << pathRange.GetStartPos() << " " << pathRange.GetEndPos() << "]";
|
|
|
|
if (hypoBitmap.Overlap(pathRange)) {
|
|
//cerr << " NO" << endl;
|
|
return false;
|
|
}
|
|
|
|
if (mgr.system.maxDistortion >= 0) {
|
|
// distortion limit
|
|
int distortion = ComputeDistortionDistance(hypoRangeEndPos, pathRange.GetStartPos());
|
|
if (distortion > mgr.system.maxDistortion) {
|
|
//cerr << " NO" << endl;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
// first question: is there a path from the closest translated word to the left
|
|
// of the hypothesized extension to the start of the hypothesized extension?
|
|
// long version:
|
|
// - is there anything to our left?
|
|
// - is it farther left than where we're starting anyway?
|
|
// - can we get to it?
|
|
|
|
// closestLeft is exclusive: a value of 3 means 2 is covered, our
|
|
// arc is currently ENDING at 3 and can start at 3 implicitly
|
|
|
|
// TODO is this relevant? only for lattice input?
|
|
|
|
// ask second question here: we already know we can get to our
|
|
// starting point from the closest thing to the left. We now ask the
|
|
// follow up: can we get from our end to the closest thing on the
|
|
// right?
|
|
//
|
|
// long version: is anything to our right? is it farther
|
|
// right than our (inclusive) end? can our end reach it?
|
|
bool isLeftMostEdge = (hypoFirstGapPos == pathRange.GetStartPos());
|
|
|
|
size_t closestRight = hypoBitmap.GetEdgeToTheRightOf(pathRange.GetEndPos());
|
|
/*
|
|
if (isWordLattice) {
|
|
if (closestRight != endPos
|
|
&& ((closestRight + 1) < sourceSize)
|
|
&& !m_source.CanIGetFromAToB(endPos + 1, closestRight + 1)) {
|
|
continue;
|
|
}
|
|
}
|
|
*/
|
|
|
|
if (isLeftMostEdge) {
|
|
// any length extension is okay if starting at left-most edge
|
|
|
|
} else { // starting somewhere other than left-most edge, use caution
|
|
// the basic idea is this: we would like to translate a phrase
|
|
// starting from a position further right than the left-most
|
|
// open gap. The distortion penalty for the following phrase
|
|
// will be computed relative to the ending position of the
|
|
// current extension, so we ask now what its maximum value will
|
|
// be (which will always be the value of the hypothesis starting
|
|
// at the left-most edge). If this value is less than the
|
|
// distortion limit, we don't allow this extension to be made.
|
|
Range bestNextExtension(hypoFirstGapPos, hypoFirstGapPos);
|
|
|
|
if (ComputeDistortionDistance(pathRange.GetEndPos(), bestNextExtension.GetStartPos())
|
|
> mgr.system.maxDistortion) {
|
|
//cerr << " NO" << endl;
|
|
return false;
|
|
}
|
|
|
|
// everything is fine, we're good to go
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
}
|
|
|
|
|