00001 #ifndef MERT_OPTIMIZER_H_
00002 #define MERT_OPTIMIZER_H_
00003
00004 #include <vector>
00005 #include <string>
00006 #include "Data.h"
00007 #include "FeatureData.h"
00008 #include "Scorer.h"
00009 #include "Types.h"
00010
00011 static const float kMaxFloat = std::numeric_limits<float>::max();
00012
00013 namespace MosesTuning
00014 {
00015
00016
00017 class Point;
00018
00022 class Optimizer
00023 {
00024 protected:
00025 Scorer *m_scorer;
00026 FeatureDataHandle m_feature_data;
00027 unsigned int m_num_random_directions;
00028
00029 const std::vector<bool>& m_positive;
00030
00031 public:
00032 Optimizer(unsigned Pd, const std::vector<unsigned>& i2O, const std::vector<bool>& positive, const std::vector<parameter_t>& start, unsigned int nrandom);
00033
00034 void SetScorer(Scorer *scorer) { m_scorer = scorer; }
00035 void SetFeatureData(FeatureDataHandle feature_data) { m_feature_data = feature_data; }
00036 virtual ~Optimizer();
00037
00038 unsigned size() const {
00039 return m_feature_data ? m_feature_data->size() : 0;
00040 }
00041
00045 statscore_t Run(Point&) const;
00046
00050 virtual statscore_t TrueRun(Point&) const = 0;
00051
00055 void Get1bests(const Point& param,std::vector<unsigned>& bests) const;
00056
00060 statscore_t GetStatScore(const std::vector<unsigned>& nbests) const {
00061 return m_scorer->score(nbests);
00062 }
00063
00064 statscore_t GetStatScore(const Point& param) const;
00065
00066 std::vector<statscore_t> GetIncStatScore(const std::vector<unsigned>& ref, const std::vector<std::vector<std::pair<unsigned,unsigned> > >& diffs) const;
00067
00071 statscore_t LineOptimize(const Point& start, const Point& direction, Point& best) const;
00072 };
00073
00074
00079 class SimpleOptimizer : public Optimizer
00080 {
00081 private:
00082 const float kEPS;
00083 public:
00084 SimpleOptimizer(unsigned dim, const std::vector<unsigned>& i2O, const std::vector<bool>& positive,
00085 const std::vector<parameter_t>& start, unsigned int nrandom)
00086 : Optimizer(dim, i2O, positive, start,nrandom), kEPS(0.0001f) {}
00087 virtual statscore_t TrueRun(Point&) const;
00088 };
00089
00093 class RandomDirectionOptimizer : public Optimizer
00094 {
00095 private:
00096 const float kEPS;
00097 public:
00098 RandomDirectionOptimizer(unsigned dim, const std::vector<unsigned>& i2O, const std::vector<bool>& positive,
00099 const std::vector<parameter_t>& start, unsigned int nrandom)
00100 : Optimizer(dim, i2O, positive, start, nrandom), kEPS(0.0001f) {}
00101 virtual statscore_t TrueRun(Point&) const;
00102 };
00103
00107 class RandomOptimizer : public Optimizer
00108 {
00109 public:
00110 RandomOptimizer(unsigned dim, const std::vector<unsigned>& i2O, const std::vector<bool>& positive,
00111 const std::vector<parameter_t>& start, unsigned int nrandom)
00112 : Optimizer(dim, i2O, positive, start, nrandom) {}
00113 virtual statscore_t TrueRun(Point&) const;
00114 };
00115
00116 }
00117
00118 #endif // OPTIMIZER_H