mosesdecoder/moses/TranslationModel/PhraseDictionaryTreeAdaptor.cpp

123 lines
3.3 KiB
C++
Raw Normal View History

// $Id$
#include <sys/stat.h>
#include <algorithm>
#include "moses/TranslationModel/PhraseDictionaryTreeAdaptor.h"
#include "moses/TranslationModel/PhraseDictionaryTree.h"
#include "moses/Phrase.h"
#include "moses/FactorCollection.h"
#include "moses/InputFileStream.h"
#include "moses/InputType.h"
#include "moses/ConfusionNet.h"
#include "moses/Sentence.h"
#include "moses/StaticData.h"
#include "moses/UniqueObject.h"
#include "moses/PDTAimp.h"
#include "moses/UserMessage.h"
#include "util/exception.hh"
2013-02-25 15:49:34 +04:00
using namespace std;
namespace Moses
{
/*************************************************************
function definitions of the interface class
virtually everything is forwarded to the implementation class
*************************************************************/
PhraseDictionaryTreeAdaptor::
2013-02-22 23:17:57 +04:00
PhraseDictionaryTreeAdaptor(const std::string &line)
: PhraseDictionary(line)
{
ReadParameters();
}
PhraseDictionaryTreeAdaptor::~PhraseDictionaryTreeAdaptor()
{
}
2013-08-15 23:20:44 +04:00
void PhraseDictionaryTreeAdaptor::Load()
{
SetFeaturesToApply();
}
2013-03-04 22:15:05 +04:00
void PhraseDictionaryTreeAdaptor::InitializeForInput(InputType const& source)
{
2013-02-25 15:49:34 +04:00
const StaticData &staticData = StaticData::Instance();
2013-08-16 18:05:36 +04:00
ReduceCache();
PDTAimp *obj = new PDTAimp(this);
2013-03-04 22:15:05 +04:00
vector<float> weight = staticData.GetWeights(this);
2013-02-22 23:17:57 +04:00
if(m_numScoreComponents!=weight.size()) {
std::stringstream strme;
strme << "ERROR: mismatch of number of scaling factors: "<<weight.size()
2013-02-22 23:17:57 +04:00
<<" "<<m_numScoreComponents<<"\n";
UserMessage::Add(strme.str());
2013-03-04 22:15:05 +04:00
abort();
}
2013-05-21 15:47:26 +04:00
obj->Create(m_input, m_output, m_filePath, weight);
2013-03-04 22:15:05 +04:00
obj->CleanUp();
// caching only required for confusion net
if(ConfusionNet const* cn=dynamic_cast<ConfusionNet const*>(&source))
2013-03-04 22:15:05 +04:00
obj->CacheSource(*cn);
m_implementation.reset(obj);
}
void PhraseDictionaryTreeAdaptor::CleanUpAfterSentenceProcessing(InputType const& source)
{
PDTAimp &obj = GetImplementation();
obj.CleanUp();
}
TargetPhraseCollection const*
PhraseDictionaryTreeAdaptor::GetTargetPhraseCollectionNonCacheLEGACY(Phrase const &src) const
{
const TargetPhraseCollection *ret = GetImplementation().GetTargetPhraseCollection(src);
2013-08-15 23:20:44 +04:00
return ret;
}
void PhraseDictionaryTreeAdaptor::EnableCache()
{
GetImplementation().useCache=1;
}
void PhraseDictionaryTreeAdaptor::DisableCache()
{
GetImplementation().useCache=0;
2013-03-04 22:15:05 +04:00
}
PDTAimp& PhraseDictionaryTreeAdaptor::GetImplementation()
2013-03-04 22:15:05 +04:00
{
PDTAimp* dict;
dict = m_implementation.get();
UTIL_THROW_IF(dict == NULL, util::Exception, "Dictionary object not yet created for this thread");
return *dict;
2013-03-04 22:15:05 +04:00
}
const PDTAimp& PhraseDictionaryTreeAdaptor::GetImplementation() const
2013-03-04 22:15:05 +04:00
{
PDTAimp* dict;
dict = m_implementation.get();
UTIL_THROW_IF(dict == NULL, util::Exception, "Dictionary object not yet created for this thread");
return *dict;
}
2013-08-07 14:48:18 +04:00
// legacy
const TargetPhraseCollectionWithSourcePhrase*
2013-08-24 00:34:10 +04:00
PhraseDictionaryTreeAdaptor::GetTargetPhraseCollectionLEGACY(InputType const& src,WordsRange const &range) const
2013-08-07 14:48:18 +04:00
{
if(GetImplementation().m_rangeCache.empty()) {
const TargetPhraseCollectionWithSourcePhrase *tpColl = GetImplementation().GetTargetPhraseCollection(src.GetSubString(range));
return tpColl;
2013-08-07 14:48:18 +04:00
} else {
2013-08-07 17:18:12 +04:00
const TargetPhraseCollectionWithSourcePhrase *tpColl = GetImplementation().m_rangeCache[range.GetStartPos()][range.GetEndPos()];
return tpColl;
2013-08-07 14:48:18 +04:00
}
}
}