00001 #include "OptimizerFactory.h"
00002 #include "Optimizer.h"
00003
00004 using namespace std;
00005
00006 namespace MosesTuning
00007 {
00008
00009
00010 vector<string> OptimizerFactory::m_type_names;
00011
00012 void OptimizerFactory::SetTypeNames()
00013 {
00014 if (m_type_names.empty()) {
00015 m_type_names.resize(NOPTIMIZER);
00016 m_type_names[POWELL] = "powell";
00017 m_type_names[RANDOM_DIRECTION] = "random-direction";
00018 m_type_names[RANDOM] = "random";
00019
00020 }
00021 }
00022 vector<string> OptimizerFactory::GetTypeNames()
00023 {
00024 if (m_type_names.empty())
00025 SetTypeNames();
00026 return m_type_names;
00027 }
00028
00029 OptimizerFactory::OptimizerType OptimizerFactory::GetOptimizerType(const string& type)
00030 {
00031 unsigned int t;
00032 if (m_type_names.empty())
00033 SetTypeNames();
00034 for (t = 0; t < m_type_names.size(); t++)
00035 if (m_type_names[t] == type)
00036 break;
00037 return((OptimizerType)t);
00038 }
00039
00040 Optimizer* OptimizerFactory::BuildOptimizer(unsigned dim,
00041 const vector<unsigned>& i2o,
00042 const std::vector<bool>& positive,
00043 const vector<parameter_t>& start,
00044 const string& type,
00045 unsigned int nrandom)
00046 {
00047 OptimizerType opt_type = GetOptimizerType(type);
00048 if (opt_type == NOPTIMIZER) {
00049 cerr << "Error: unknown Optimizer type " << type << endl;
00050 cerr << "Known Algorithm are:" << endl;
00051 unsigned int t;
00052 for (t = 0; t < m_type_names.size(); t++)
00053 cerr << m_type_names[t] << endl;
00054 throw ("unknown Optimizer Type");
00055 }
00056
00057 switch (opt_type) {
00058 case POWELL:
00059 return new SimpleOptimizer(dim, i2o, positive, start, nrandom);
00060 break;
00061 case RANDOM_DIRECTION:
00062 return new RandomDirectionOptimizer(dim, i2o, positive, start, nrandom);
00063 break;
00064 case RANDOM:
00065 return new RandomOptimizer(dim, i2o, positive, start, nrandom);
00066 break;
00067 default:
00068 cerr << "Error: unknown optimizer" << type << endl;
00069 return NULL;
00070 }
00071 }
00072
00073 }