00001 #include "Optimizer.h"
00002 #include <iostream>
00003
00004 namespace MosesServer
00005 {
00006 using namespace std;
00007
00008 Optimizer::
00009 Optimizer()
00010 {
00011
00012
00013
00014 this->_signature = "S:S";
00015 this->_help = "Optimizes multi-model translation model";
00016 }
00017
00018 void
00019 Optimizer::
00020 execute(xmlrpc_c::paramList const& paramList,
00021 xmlrpc_c::value * const retvalP)
00022 {
00023 #ifdef WITH_DLIB
00024 const params_t params = paramList.getStruct(0);
00025 params_t::const_iterator si;
00026 if ((si = params.find("model_name")) == params.end()) {
00027 string msg = "Missing name of model to be optimized";
00028 msg += " (e.g. PhraseDictionaryMultiModelCounts0)";
00029 throw xmlrpc_c::fault(msg, xmlrpc_c::fault::CODE_PARSE);
00030 }
00031 const string model_name = xmlrpc_c::value_string(si->second);
00032
00033 if ((si = params.find("phrase_pairs")) == params.end()) {
00034 throw xmlrpc_c::fault("Missing list of phrase pairs",
00035 xmlrpc_c::fault::CODE_PARSE);
00036 }
00037
00038
00039 vector<pair<string, string> > phrase_pairs;
00040
00041 xmlrpc_c::value_array pp_array = xmlrpc_c::value_array(si->second);
00042 vector<xmlrpc_c::value> ppValVec(pp_array.vectorValueValue());
00043 for (size_t i = 0; i < ppValVec.size(); ++i) {
00044 xmlrpc_c::value_array pp_array
00045 = xmlrpc_c::value_array(ppValVec[i]);
00046 vector<xmlrpc_c::value> pp(pp_array.vectorValueValue());
00047 string L1 = xmlrpc_c::value_string(pp[0]);
00048 string L2 = xmlrpc_c::value_string(pp[1]);
00049 phrase_pairs.push_back(make_pair(L1,L2));
00050 }
00051
00052
00053
00054 PhraseDictionaryMultiModel* pdmm = FindPhraseDictionary(model_name);
00055 vector<float> weight_vector = pdmm->MinimizePerplexity(phrase_pairs);
00056
00057 vector<xmlrpc_c::value> weight_vector_ret;
00058 for (size_t i=0; i < weight_vector.size(); i++)
00059 weight_vector_ret.push_back(xmlrpc_c::value_double(weight_vector[i]));
00060
00061 *retvalP = xmlrpc_c::value_array(weight_vector_ret);
00062 #else
00063 string errmsg = "Error: Perplexity minimization requires dlib ";
00064 errmsg += "(compilation option --with-dlib)";
00065 std::cerr << errmsg << std::endl;
00066 *retvalP = xmlrpc_c::value_string(errmsg);
00067 #endif
00068 }
00069 }