⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trellispath.cpp.svn-base

📁 moses开源的机器翻译系统
💻 SVN-BASE
字号:
// $Id$/***********************************************************************Moses - factored phrase-based language decoderCopyright (C) 2006 University of EdinburghThis library is free software; you can redistribute it and/ormodify it under the terms of the GNU Lesser General PublicLicense as published by the Free Software Foundation; eitherversion 2.1 of the License, or (at your option) any later version.This library is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNULesser General Public License for more details.You should have received a copy of the GNU Lesser General PublicLicense along with this library; if not, write to the Free SoftwareFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA***********************************************************************/#include "TrellisPath.h"#include "TrellisPathCollection.h"#include "StaticData.h"using namespace std;TrellisPath::TrellisPath(const Hypothesis *hypo):	m_prevEdgeChanged(NOT_FOUND){	m_scoreBreakdown					= hypo->GetScoreBreakdown();	m_totalScore = hypo->GetTotalScore();	// enumerate path using prevHypo	while (hypo != NULL)	{		m_path.push_back(hypo);		hypo = hypo->GetPrevHypo();	}}TrellisPath::TrellisPath(const TrellisPath &copy, size_t edgeIndex, const Hypothesis *arc):m_prevEdgeChanged(edgeIndex){	for (size_t currEdge = 0 ; currEdge < edgeIndex ; currEdge++)	{ // copy path from parent		m_path.push_back(copy.m_path[currEdge]);	}		// 1 deviation	m_path.push_back(arc);	// rest of path comes from following best path backwards	const Hypothesis *prevHypo = arc->GetPrevHypo();	while (prevHypo != NULL)	{		m_path.push_back(prevHypo);		prevHypo = prevHypo->GetPrevHypo();	}	// Calc score	m_totalScore		= m_path[0]->GetWinningHypo()->GetTotalScore();	m_scoreBreakdown= m_path[0]->GetWinningHypo()->GetScoreBreakdown();	size_t sizePath = m_path.size();	for (size_t pos = 0 ; pos < sizePath ; pos++)	{		const Hypothesis *hypo = m_path[pos];		const Hypothesis *winningHypo = hypo->GetWinningHypo();		if (hypo != winningHypo)		{			m_totalScore = m_totalScore - winningHypo->GetTotalScore() + hypo->GetTotalScore();			m_scoreBreakdown.MinusEquals(winningHypo->GetScoreBreakdown());			m_scoreBreakdown.PlusEquals(hypo->GetScoreBreakdown());		}	}}void TrellisPath::CreateDeviantPaths(TrellisPathCollection &pathColl) const{	const size_t sizePath = m_path.size();	if (m_prevEdgeChanged == NOT_FOUND)	{ // initial enumration from a pure hypo		for (size_t currEdge = 0 ; currEdge < sizePath ; currEdge++)		{			const Hypothesis	*hypo		= static_cast<const Hypothesis*>(m_path[currEdge]);			const ArcList *pAL = hypo->GetArcList();      if (!pAL) continue;			const ArcList &arcList = *pAL;			// every possible Arc to replace this edge			ArcList::const_iterator iterArc;			for (iterArc = arcList.begin() ; iterArc != arcList.end() ; ++iterArc)			{				const Hypothesis *arc = *iterArc;				TrellisPath *deviantPath = new TrellisPath(*this, currEdge, arc);				pathColl.Add(deviantPath);			}		}	}	else	{	// wiggle 1 of the edges only		for (size_t currEdge = m_prevEdgeChanged + 1 ; currEdge < sizePath ; currEdge++)		{			const ArcList *pAL = m_path[currEdge]->GetArcList();    	if (!pAL) continue;			const ArcList &arcList = *pAL;			ArcList::const_iterator iterArc;			for (iterArc = arcList.begin() ; iterArc != arcList.end() ; ++iterArc)			{	// copy this Path & change 1 edge				const Hypothesis *arcReplace = *iterArc;				TrellisPath *deviantPath = new TrellisPath(*this, currEdge, arcReplace);				pathColl.Add(deviantPath);									} // for (iterArc...		} // for (currEdge = 0 ...	}}Phrase TrellisPath::GetTargetPhrase() const{	Phrase targetPhrase(Output);	int numHypo = (int) m_path.size();	for (int node = numHypo - 2 ; node >= 0 ; --node)	{ // don't do the empty hypo - waste of time and decode step id is invalid		const Hypothesis &hypo = *m_path[node];		const Phrase &currTargetPhrase = hypo.GetCurrTargetPhrase();		targetPhrase.Append(currTargetPhrase);	}	return targetPhrase;}Phrase TrellisPath::GetSurfacePhrase() const{	const std::vector<FactorType> &outputFactor = StaticData::Instance().GetOutputFactorOrder();	Phrase targetPhrase = GetTargetPhrase()				,ret(Output);	for (size_t pos = 0 ; pos < targetPhrase.GetSize() ; ++pos)	{		Word &newWord = ret.AddWord();		for (size_t i = 0 ; i < outputFactor.size() ; i++)		{			FactorType factorType = outputFactor[i];			const Factor *factor = ret.GetFactor(pos, factorType);			assert(factor);			newWord[factorType] = factor;		}	}	return ret;}TO_STRING_BODY(TrellisPath);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -