mosesdecoder/moses/InputPath.cpp

81 lines
2.5 KiB
C++
Raw Normal View History

#include "InputPath.h"
2013-07-09 01:47:02 +04:00
#include "ScoreComponentCollection.h"
2013-07-18 23:39:15 +04:00
#include "TargetPhraseCollection.h"
2013-07-19 02:09:33 +04:00
#include "StaticData.h"
#include "TypeDef.h"
namespace Moses
{
2013-07-09 01:47:02 +04:00
InputPath::InputPath(const Phrase &phrase, const WordsRange &range, const InputPath *prevNode
,const ScoreComponentCollection *inputScore)
2013-07-09 01:47:02 +04:00
:m_prevNode(prevNode)
,m_phrase(phrase)
,m_range(range)
,m_inputScore(inputScore)
2013-07-09 01:47:02 +04:00
{
2013-07-19 02:09:33 +04:00
FactorType factorType = StaticData::Instance().GetPlaceholderFactor();
if (factorType != NOT_FOUND) {
2013-07-19 16:52:47 +04:00
for (size_t pos = 0; pos < m_phrase.GetSize(); ++pos) {
2013-07-19 02:09:33 +04:00
if (m_phrase.GetFactor(pos, factorType)) {
m_placeholders.push_back(pos);
}
}
}
2013-07-09 01:47:02 +04:00
}
InputPath::~InputPath()
{
delete m_inputScore;
2013-07-18 23:39:15 +04:00
// detach target phrase before delete objects from m_copiedSet
// the phrase dictionary owns the target phrases so they should be doing the deleting
std::vector<TargetPhraseCollection>::iterator iter;
for (iter = m_copiedSet.begin(); iter != m_copiedSet.end(); ++iter) {
TargetPhraseCollection &coll = *iter;
coll.Detach();
}
2013-07-09 01:47:02 +04:00
}
2013-07-07 05:14:51 +04:00
const TargetPhraseCollection *InputPath::GetTargetPhrases(const PhraseDictionary &phraseDictionary) const
{
std::map<const PhraseDictionary*, std::pair<const TargetPhraseCollection*, const void*> >::const_iterator iter;
iter = m_targetPhrases.find(&phraseDictionary);
if (iter == m_targetPhrases.end()) {
2013-07-05 02:38:18 +04:00
return NULL;
}
return iter->second.first;
}
2013-07-07 05:14:51 +04:00
const void *InputPath::GetPtNode(const PhraseDictionary &phraseDictionary) const
{
std::map<const PhraseDictionary*, std::pair<const TargetPhraseCollection*, const void*> >::const_iterator iter;
iter = m_targetPhrases.find(&phraseDictionary);
if (iter == m_targetPhrases.end()) {
2013-07-05 02:38:18 +04:00
return NULL;
}
return iter->second.second;
}
2013-07-18 23:23:44 +04:00
void InputPath::SetTargetPhrases(const PhraseDictionary &phraseDictionary
, const TargetPhraseCollection *targetPhrases
, const void *ptNode) {
std::pair<const TargetPhraseCollection*, const void*> value(targetPhrases, ptNode);
m_targetPhrases[&phraseDictionary] = value;
}
2013-07-07 05:14:51 +04:00
std::ostream& operator<<(std::ostream& out, const InputPath& obj)
{
2013-07-05 02:38:18 +04:00
out << &obj << " " << obj.GetWordsRange() << " " << obj.GetPrevNode() << " " << obj.GetPhrase();
2013-07-05 02:38:18 +04:00
out << "pt: ";
std::map<const PhraseDictionary*, std::pair<const TargetPhraseCollection*, const void*> >::const_iterator iter;
for (iter = obj.m_targetPhrases.begin(); iter != obj.m_targetPhrases.end(); ++iter) {
const PhraseDictionary *pt = iter->first;
out << pt << " ";
}
2013-07-05 02:38:18 +04:00
return out;
}
}