SecondOrderTrustRegion.h 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*
  2. * NICE-Core - efficient algebra and computer vision methods
  3. * - liboptimization - An optimization/template for new NICE libraries
  4. * See file License for license information.
  5. */
  6. /*****************************************************************************/
  7. #ifndef _SECONDORDERTRUSTREGION_OPTIMIZATION_H
  8. #define _SECONDORDERTRUSTREGION_OPTIMIZATION_H
  9. #include <iostream>
  10. #include <core/basics/NonCopyable.h>
  11. #include <core/optimization/gradientBased/OptimizationAlgorithmSecond.h>
  12. #include <core/optimization/gradientBased/TrustRegionBase.h>
  13. namespace NICE {
  14. /**
  15. * A second order trust region algorithm.
  16. * Notation as in Ferid Bajramovic: Kernel-basierte Objektverfolgung,
  17. * Master's thesis (Diplomarbeit),
  18. * Computer Science Department, University Passau
  19. *
  20. * \ingroup optimization_algorithms
  21. */
  22. class SecondOrderTrustRegion : public OptimizationAlgorithmSecond,
  23. public TrustRegionBase {
  24. public:
  25. SecondOrderTrustRegion(double typicalGradient = 0.1)
  26. : TrustRegionBase(typicalGradient), kappa(0.1),
  27. epsilonLambda(1E5 * epsilonM), maxSubIterations(150),
  28. tolerance(1E-14) {}
  29. virtual ~SecondOrderTrustRegion();
  30. /**
  31. * Set epsilonLambda relative to epsilonM
  32. */
  33. inline void setEpsilonLambdaRelative(double factor) {
  34. epsilonLambda = factor * epsilonM;
  35. }
  36. /**
  37. * Set epsilonLambda
  38. */
  39. inline void setEpsilonLambdaAbsolute(double newValue) {
  40. epsilonLambda = newValue;
  41. }
  42. protected:
  43. virtual void doOptimize(OptimizationProblemSecond& problem);
  44. private:
  45. //! \f$\kappa\f$
  46. double kappa;
  47. //! \f$\epsilon_{\lambda}\f$
  48. double epsilonLambda;
  49. unsigned int maxSubIterations;
  50. double tolerance;
  51. /**
  52. * Compute the initial trust region radius.
  53. */
  54. double computeInitialDelta(const Vector& gradient,
  55. const Matrix& hessian);
  56. };
  57. }; // namespace NICE
  58. #endif /* _SECONDORDERTRUSTREGION_OPTIMIZATION_H */