summaryrefslogtreecommitdiff
path: root/dpmert/line_optimizer.h
blob: 83819f41b336df5ca2b0f025fe5b02d575e3fe36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#ifndef LINE_OPTIMIZER_H_
#define LINE_OPTIMIZER_H_

#include <vector>

#include "sparse_vector.h"
#include "error_surface.h"
#include "sampler.h"

class EvaluationMetric;
class Weights;

struct LineOptimizer {

  // use MINIMIZE_SCORE for things like TER, WER
  // MAXIMIZE_SCORE for things like BLEU
  enum ScoreType { MAXIMIZE_SCORE, MINIMIZE_SCORE };

  // merge all the error surfaces together into a global
  // error surface and find (the middle of) the best segment
  static double LineOptimize(
     const EvaluationMetric* metric,
     const std::vector<ErrorSurface>& envs,
     const LineOptimizer::ScoreType type,
     float* best_score,
     const double epsilon = 1.0/65536.0);

  // return a random vector of length 1 where all dimensions
  // not listed in dimensions will be 0.
  static void RandomUnitVector(const std::vector<int>& dimensions,
                               SparseVector<double>* axis,
                               RandomNumberGenerator<boost::mt19937>* rng);

  // generate a list of directions to optimize; the list will
  // contain the orthogonal vectors corresponding to the dimensions in
  // primary and then additional_random_directions directions in those
  // dimensions as well.  All vectors will be length 1.
  static void CreateOptimizationDirections(
     const std::vector<int>& primary,
     int additional_random_directions,
     RandomNumberGenerator<boost::mt19937>* rng,
     std::vector<SparseVector<double> >* dirs
     , bool include_primary=true
    );

};

#endif