random_search.cpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536
  1. #include "random_search.h"
  2. #include <iostream>
  3. #include <cassert>
  4. template <
  5. typename Scalar,
  6. typename DerivedX,
  7. typename DerivedLB,
  8. typename DerivedUB>
  9. IGL_INLINE Scalar igl::random_search(
  10. const std::function< Scalar (DerivedX &) > f,
  11. const Eigen::MatrixBase<DerivedLB> & LB,
  12. const Eigen::MatrixBase<DerivedUB> & UB,
  13. const int iters,
  14. DerivedX & X)
  15. {
  16. Scalar min_f = std::numeric_limits<Scalar>::max();
  17. const int dim = LB.size();
  18. assert(UB.size() == dim && "UB should match LB size");
  19. for(int iter = 0;iter<iters;iter++)
  20. {
  21. const DerivedX R = DerivedX::Random(dim).array()*0.5+0.5;
  22. DerivedX Xr = LB.array() + R.array()*(UB-LB).array();
  23. const Scalar fr = f(Xr);
  24. if(fr<min_f)
  25. {
  26. min_f = fr;
  27. X = Xr;
  28. }
  29. }
  30. return min_f;
  31. }
  32. #ifdef IGL_STATIC_LIBRARY
  33. template float igl::random_search<float, Eigen::Matrix<float, 1, -1, 1, 1, -1>, Eigen::Matrix<float, 1, -1, 1, 1, -1>, Eigen::Matrix<float, 1, -1, 1, 1, -1> >(std::function<float (Eigen::Matrix<float, 1, -1, 1, 1, -1>&)>, Eigen::MatrixBase<Eigen::Matrix<float, 1, -1, 1, 1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<float, 1, -1, 1, 1, -1> > const&, int, Eigen::Matrix<float, 1, -1, 1, 1, -1>&);
  34. #endif