|
#include "Optimizer.h" |
|
#include <iostream> |
|
|
|
namespace MosesServer |
|
{ |
|
using namespace std; |
|
|
|
Optimizer:: |
|
Optimizer() |
|
{ |
|
|
|
|
|
|
|
this->_signature = "S:S"; |
|
this->_help = "Optimizes multi-model translation model"; |
|
} |
|
|
|
void |
|
Optimizer:: |
|
execute(xmlrpc_c::paramList const& paramList, |
|
xmlrpc_c::value * const retvalP) |
|
{ |
|
#ifdef WITH_DLIB |
|
const params_t params = paramList.getStruct(0); |
|
params_t::const_iterator si; |
|
if ((si = params.find("model_name")) == params.end()) { |
|
string msg = "Missing name of model to be optimized"; |
|
msg += " (e.g. PhraseDictionaryMultiModelCounts0)"; |
|
throw xmlrpc_c::fault(msg, xmlrpc_c::fault::CODE_PARSE); |
|
} |
|
const string model_name = xmlrpc_c::value_string(si->second); |
|
|
|
if ((si = params.find("phrase_pairs")) == params.end()) { |
|
throw xmlrpc_c::fault("Missing list of phrase pairs", |
|
xmlrpc_c::fault::CODE_PARSE); |
|
} |
|
|
|
|
|
vector<pair<string, string> > phrase_pairs; |
|
|
|
xmlrpc_c::value_array pp_array = xmlrpc_c::value_array(si->second); |
|
vector<xmlrpc_c::value> ppValVec(pp_array.vectorValueValue()); |
|
for (size_t i = 0; i < ppValVec.size(); ++i) { |
|
xmlrpc_c::value_array pp_array |
|
= xmlrpc_c::value_array(ppValVec[i]); |
|
vector<xmlrpc_c::value> pp(pp_array.vectorValueValue()); |
|
string L1 = xmlrpc_c::value_string(pp[0]); |
|
string L2 = xmlrpc_c::value_string(pp[1]); |
|
phrase_pairs.push_back(make_pair(L1,L2)); |
|
} |
|
|
|
|
|
|
|
PhraseDictionaryMultiModel* pdmm = FindPhraseDictionary(model_name); |
|
vector<float> weight_vector = pdmm->MinimizePerplexity(phrase_pairs); |
|
|
|
vector<xmlrpc_c::value> weight_vector_ret; |
|
for (size_t i=0; i < weight_vector.size(); i++) |
|
weight_vector_ret.push_back(xmlrpc_c::value_double(weight_vector[i])); |
|
|
|
*retvalP = xmlrpc_c::value_array(weight_vector_ret); |
|
#else |
|
string errmsg = "Error: Perplexity minimization requires dlib "; |
|
errmsg += "(compilation option --with-dlib)"; |
|
std::cerr << errmsg << std::endl; |
|
*retvalP = xmlrpc_c::value_string(errmsg); |
|
#endif |
|
} |
|
} |
|
|