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) {
00035 m_scorer = scorer;
00036 }
00037 void SetFeatureData(FeatureDataHandle feature_data) {
00038 m_feature_data = feature_data;
00039 }
00040 virtual ~Optimizer();
00041
00042 unsigned size() const {
00043 return m_feature_data ? m_feature_data->size() : 0;
00044 }
00045
00049 statscore_t Run(Point&) const;
00050
00054 virtual statscore_t TrueRun(Point&) const = 0;
00055
00059 void Get1bests(const Point& param,std::vector<unsigned>& bests) const;
00060
00064 statscore_t GetStatScore(const std::vector<unsigned>& nbests) const {
00065 return m_scorer->score(nbests);
00066 }
00067
00068 statscore_t GetStatScore(const Point& param) const;
00069
00070 std::vector<statscore_t> GetIncStatScore(const std::vector<unsigned>& ref, const std::vector<std::vector<std::pair<unsigned,unsigned> > >& diffs) const;
00071
00075 statscore_t LineOptimize(const Point& start, const Point& direction, Point& best) const;
00076 };
00077
00078
00083 class SimpleOptimizer : public Optimizer
00084 {
00085 private:
00086 const float kEPS;
00087 public:
00088 SimpleOptimizer(unsigned dim, const std::vector<unsigned>& i2O, const std::vector<bool>& positive,
00089 const std::vector<parameter_t>& start, unsigned int nrandom)
00090 : Optimizer(dim, i2O, positive, start,nrandom), kEPS(0.0001f) {}
00091 virtual statscore_t TrueRun(Point&) const;
00092 };
00093
00097 class RandomDirectionOptimizer : public Optimizer
00098 {
00099 private:
00100 const float kEPS;
00101 public:
00102 RandomDirectionOptimizer(unsigned dim, const std::vector<unsigned>& i2O, const std::vector<bool>& positive,
00103 const std::vector<parameter_t>& start, unsigned int nrandom)
00104 : Optimizer(dim, i2O, positive, start, nrandom), kEPS(0.0001f) {}
00105 virtual statscore_t TrueRun(Point&) const;
00106 };
00107
00111 class RandomOptimizer : public Optimizer
00112 {
00113 public:
00114 RandomOptimizer(unsigned dim, const std::vector<unsigned>& i2O, const std::vector<bool>& positive,
00115 const std::vector<parameter_t>& start, unsigned int nrandom)
00116 : Optimizer(dim, i2O, positive, start, nrandom) {}
00117 virtual statscore_t TrueRun(Point&) const;
00118 };
00119
00120 }
00121
00122 #endif // OPTIMIZER_H