|
#include "ExternalFeature.h" |
|
#include <dlfcn.h> |
|
#include <cstdlib> |
|
#include <iostream> |
|
#include "util/exception.hh" |
|
|
|
using namespace std; |
|
|
|
namespace Moses |
|
{ |
|
ExternalFeatureState::ExternalFeatureState(int stateSize, void *data) |
|
{ |
|
m_stateSize = stateSize; |
|
m_data = malloc(stateSize); |
|
memcpy(m_data, data, stateSize); |
|
} |
|
|
|
void ExternalFeature::Load(AllOptions const& opts) |
|
{ |
|
string nparam = "testing"; |
|
|
|
if (m_path.size() < 1) { |
|
UTIL_THROW2("External requires a path to a dynamic library"); |
|
} |
|
lib_handle = dlopen(m_path.c_str(), RTLD_LAZY); |
|
if (!lib_handle) { |
|
UTIL_THROW2("dlopen reports: " << dlerror() << ". Did you provide a full path to the dynamic library?";); |
|
} |
|
CdecFF* (*fn)(const string&) = |
|
(CdecFF* (*)(const string&))(dlsym(lib_handle, "create_ff")); |
|
if (!fn) { |
|
UTIL_THROW2("dlsym reports: " << dlerror()); |
|
} |
|
ff_ext = (*fn)(nparam); |
|
m_stateSize = ff_ext->StateSize(); |
|
|
|
} |
|
|
|
ExternalFeature::~ExternalFeature() |
|
{ |
|
delete ff_ext; |
|
dlclose(lib_handle); |
|
} |
|
|
|
void ExternalFeature::SetParameter(const std::string& key, const std::string& value) |
|
{ |
|
if (key == "path") { |
|
m_path = value; |
|
} else { |
|
StatefulFeatureFunction::SetParameter(key, value); |
|
} |
|
} |
|
|
|
FFState* ExternalFeature::EvaluateWhenApplied( |
|
const Hypothesis& cur_hypo, |
|
const FFState* prev_state, |
|
ScoreComponentCollection* accumulator) const |
|
{ |
|
return new ExternalFeatureState(m_stateSize); |
|
} |
|
|
|
FFState* ExternalFeature::EvaluateWhenApplied( |
|
const ChartHypothesis& , |
|
int , |
|
ScoreComponentCollection* accumulator) const |
|
{ |
|
return new ExternalFeatureState(m_stateSize); |
|
} |
|
|
|
|
|
} |
|
|
|
|