SOT
merit_functions.h
1 
9 #ifndef SOT_MERIT_FUNCTIONS_H
10 #define SOT_MERIT_FUNCTIONS_H
11 
12 #include "common.h"
13 #include "utils.h"
14 
16 namespace sot {
17 
19 
28  class MeritFunction {
29  public:
31 
40  virtual inline mat pickPoints(const mat &cand, const std::shared_ptr<Surrogate>& surf,
41  const mat &points, int newPoints, double distTol) = 0;
42  };
43 
45 
57  protected:
58  vec mWeights = {0.3, 0.5, 0.8, 0.95};
59  int mNextWeight = 0;
60  public:
61  inline mat pickPoints(const mat &cand, const std::shared_ptr<Surrogate>& surf, const mat &points, int newPoints, double distTol) {
62  int dim = cand.n_rows;
63 
64  // Compute the distances in single precision
65  //mat dists = arma::sqrt(arma::conv_to<mat>::from(squaredPairwiseDistance<fmat>(
66  // arma::conv_to<fmat>::from(points), arma::conv_to<fmat>::from(cand))));
67  mat dists = arma::sqrt(squaredPairwiseDistance<mat>(points, cand));
68  // Evaluate the RBF at the candidate points
69  vec surfVals = surf->evals(cand);
70  vec valScores = unitRescale(surfVals);
71  vec minDists = arma::min(dists).t();
72  vec distScores = 1.0 - unitRescale(minDists);
73 
74  mat newx = arma::zeros<mat>(dim, newPoints);
75 
76  arma::uword winner;
77  for(int i=0; i < newPoints; i++) {
78  double weight = mWeights[mNextWeight % mWeights.n_elem];
79  mNextWeight++;
80 
81  // Update distances if necessary
82  if (i > 0) {
83  vec newDists = arma::sqrt(squaredPointSetDistance<mat,vec>((vec)newx.col(i-1), cand));
84  minDists = arma::min(minDists, newDists);
85  valScores(winner) = std::numeric_limits<double>::max();
86  distScores = 1.0 - unitRescale(minDists);
87  }
88 
89  // Pick a winner
90  vec merit = weight * valScores + (1.0 - weight) * distScores;
91  merit.elem(arma::find(minDists < distTol)).fill(std::numeric_limits<double>::max());
92  double scores = merit.min(winner);
93  newx.col(i) = cand.col(winner);
94  }
95 
96  return newx;
97  }
98  };
99 }
100 
101 #endif
mat pickPoints(const mat &cand, const std::shared_ptr< Surrogate > &surf, const mat &points, int newPoints, double distTol)
Method for picking the next point.
Definition: merit_functions.h:61
Abstract class for a SOT merit function.
Definition: merit_functions.h:28
arma::vec vec
Default (column) vector class.
Definition: common.h:17
Merit function for choosing candidate points.
Definition: merit_functions.h:56
vec unitRescale(const vec &x)
Map a vector of values to the range [0, 1].
Definition: utils.h:119
SOT namespace.
Definition: sot.h:27
virtual mat pickPoints(const mat &cand, const std::shared_ptr< Surrogate > &surf, const mat &points, int newPoints, double distTol)=0
Method for picking the next point.
arma::mat mat
Default matrix class.
Definition: common.h:16