From c898f8e63f117d67391e75becf59487a32322c22 Mon Sep 17 00:00:00 2001 From: Marcin Junczys-Dowmunt Date: Thu, 8 Jan 2015 15:35:54 +0100 Subject: [PATCH] ThreadLocalFeatureStorage --- moses/FF/VW/ThreadLocalFeatureStorage.cpp | 9 ++++ moses/FF/VW/ThreadLocalFeatureStorage.h | 51 +++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 moses/FF/VW/ThreadLocalFeatureStorage.cpp create mode 100644 moses/FF/VW/ThreadLocalFeatureStorage.h diff --git a/moses/FF/VW/ThreadLocalFeatureStorage.cpp b/moses/FF/VW/ThreadLocalFeatureStorage.cpp new file mode 100644 index 000000000..c235b195a --- /dev/null +++ b/moses/FF/VW/ThreadLocalFeatureStorage.cpp @@ -0,0 +1,9 @@ + +#include "ThreadLocalFeatureStorage.h" + +namespace Moses +{ + TSNameFeatureMap ThreadLocalFeatureStorage::m_nameMap; +} + + diff --git a/moses/FF/VW/ThreadLocalFeatureStorage.h b/moses/FF/VW/ThreadLocalFeatureStorage.h new file mode 100644 index 000000000..8aba9edbf --- /dev/null +++ b/moses/FF/VW/ThreadLocalFeatureStorage.h @@ -0,0 +1,51 @@ +#pragma once + +#include +#include +#include +#include + +#include + +#include "moses/FF/FeatureFunction.h" + +namespace Moses +{ + +typedef std::vector Features; +typedef std::map NameFeatureMap; +typedef boost::thread_specific_ptr TSNameFeatureMap; + +class ThreadLocalFeatureStorage +{ + public: + + ThreadLocalFeatureStorage(FeatureFunction* ff) : m_ff(ff) {} + + virtual Features& GetStoredFeatures() { + return (*m_nameMap)[m_ff->GetScoreProducerDescription()]; + } + + virtual const Features& GetStoredFeatures() const { + NameFeatureMap::const_iterator it + = m_nameMap->find(m_ff->GetScoreProducerDescription()); + + UTIL_THROW_IF2(it == m_nameMap->end(), + "No features stored for: " << m_ff->GetScoreProducerDescription()); + + return it->second; + } + + virtual void InitializeForInput(InputType const& source) { + if(!m_nameMap.get()) + m_nameMap.reset(new NameFeatureMap()); + + (*m_nameMap)[m_ff->GetScoreProducerDescription()].clear(); + } + + private: + FeatureFunction* m_ff; + static TSNameFeatureMap m_nameMap; +}; + +}