Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
LineMinimizer.hh
Go to the documentation of this file.
1 // -*- mode:c++;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t -*-
2 // vi: set ts=2 noet:
3 //
4 // (c) Copyright Rosetta Commons Member Institutions.
5 // (c) This file is part of the Rosetta software suite and is made available under license.
6 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
7 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
8 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
9 
10 /// @file core/optimization/LineMinimizer.hh
11 /// @brief line minimizer classes
12 /// @author Phil Bradley
13 /// @author Jim Havranek
14 
15 
16 #ifndef INCLUDED_core_optimization_LineMinimizer_hh
17 #define INCLUDED_core_optimization_LineMinimizer_hh
18 
19 
20 // Package headers
22 // AUTO-REMOVED #include <core/optimization/MinimizerOptions.hh>
24 
26 
27 #include <utility/pointer/owning_ptr.hh>
28 #include <utility/pointer/ReferenceCount.hh>
29 
30 #include <utility/vector1.hh>
31 
32 namespace core {
33 namespace optimization {
34 
35 // Functor that stores current position and
36 // search direction to provide a Real->Real mapping
37 // for univariate minimization
38 
39 class func_1d {
40  private:
44  public:
46  private:
47  Multifunc const & _func;
51  public:
52  func_1d( Multivec & start, Multivec & dir, Multifunc const & score_fxn ):
53  _starting_point( start ),
54  _search_direction( dir ),
55  _eval_point( dir.size(), 0.0 ),
56  _dE_dvars( dir.size(), 0.0 ),
57  _func( score_fxn ), _eval_count( 0 ), _deriv_count( 0 ),
59  assert( _starting_point.size() == _search_direction.size() );
60  //for( uint i = 1 ; i <= _starting_point.size() ; ++i ) {
61  // _search_direction_magnitude += _search_direction[i] * _search_direction[i];
62  //}
63  //_search_direction_magnitude = std::sqrt( _search_direction_magnitude );
64  };
65  Real operator() ( Real displacement ) {
66  _eval_count++;
67  for( uint i = 1 ; i <= _starting_point.size() ; ++i ) {
69  ( displacement * _search_direction[i] );
70  }
71  return _func( _eval_point );
72  };
73  Real dfunc( Real displacement ) {
74  _deriv_count++;
75  Real dot_product( 0.0 );
76  for( uint i = 1 ; i <= _starting_point.size() ; ++i ) {
78  ( displacement * _search_direction[i] );
79  }
81  for( uint i = 1 ; i <= _starting_point.size() ; ++i ) {
82  dot_product += ( _dE_dvars[i] * _search_direction[i] );
83  }
84  return dot_product;
85  };
86  void reset_eval_count() { _eval_count = 0; };
87  int get_eval_count() { return _eval_count; };
88  int get_deriv_count() { return _deriv_count; };
89  /// @brief Error condition wherein the computed gradient does not match the actual gradient;
90  /// invokes the Multifunc::dump( vars, vars2 ) method.
91  void dump( Real displacement );
92  //Real search_direction_magnitude() { return _search_direction_magnitude; };
93 };
94 
95 /////////////////////////////////////////////////////////
96 // base class / interface for line minimizers
97 /////////////////////////////////////////////////////////
99 {
100 public:
101  virtual ~LineMinimizationAlgorithm();
102  LineMinimizationAlgorithm( Multifunc const & score_fxn, Size dimension ) :
103  _stored_derivatives( dimension, 0.0 ),
104  _last_accepted_step( 1.0 ), _func_to_beat( 0.0 ),
105  _deriv_sum( 0.0 ),_num_linemin_calls(0),_tolerance( 0.1 ),
106  _func( score_fxn ), _nonmonotone( false ), _silent( false ) {};
107  virtual Real operator()( Multivec & , Multivec & ){ return 0.0; };
108  virtual bool provide_stored_derivatives(){ return false; };
109  bool nonmonotone() { return _nonmonotone; };
110  void store_current_derivatives( Multivec & curr_derivs );
111  void fetch_stored_derivatives( Multivec & get_derivs );
112  Real quadratic_interpolation( Real point1, Real func1, Real deriv1, Real point2, Real func2 );
113  Real quadratic_deriv_interpolation( Real point1, Real func1, Real deriv1, Real point2, Real func2, Real deriv2 );
114  Real secant_interpolation( Real point1, Real deriv1, Real point2, Real deriv2 );
115  Real cubic_interpolation( Real point1, Real func1, Real deriv1, Real point2, Real func2, Real deriv2 );
116 
117  bool silent() { return _silent; };
118  void silent(bool s_in) { _silent=s_in; };
119 
120 
126 protected:
128  Multifunc const & _func;
130  bool _silent;
131 };
132 
133 /////////////////////////////////////////////////////////
134 // concrete line minimizer - Brent's method
135 /////////////////////////////////////////////////////////
136 
138 {
139 public:
140  BrentLineMinimization( Multifunc const & score_fxn, Size dim ) :
141  LineMinimizationAlgorithm( score_fxn, dim ),
142  _ax( 0.0 ), _bx( 0.2 ), _xx( 0.1 ), _abs_tolerance( 0.01 ){};
143  virtual Real operator()( Multivec & curr_pos, Multivec & curr_dir );
144  void MNBRAK( Real & AX, Real & BX, Real & CX, Real & FA, Real & FB,
145  Real & FC, func_1d & func_eval) const;
146  Real BRENT( Real const AX, Real const BX, Real const CX, Real & FA,
147  Real & FB, Real const FC, Real const TOL, func_1d & func_eval);
152 };
153 
154 /////////////////////////////////////////////////////////
155 // concrete line minimizer - Armijo's method
156 /////////////////////////////////////////////////////////
157 
159 {
160 public:
161  ArmijoLineMinimization( Multifunc const & score_fxn, bool nonmonotone, Size dim ) :
162  LineMinimizationAlgorithm( score_fxn, dim ),
163  _num_calls( 0 ) { _nonmonotone = nonmonotone; };
164  virtual bool provide_stored_derivatives(){ return false; };
165  virtual Real operator()( Multivec & curr_pos, Multivec & curr_dir );
166  Real Armijo( Real init_step, func_1d & func_eval );
167 
169 };
170 
171 /////////////////////////////////////////////////////////
172 // concrete line minimizer - Satisfies strong Wolfe conditions
173 // Roughly following More' amd Thuente, 1994
174 /////////////////////////////////////////////////////////
175 
177 {
178 public:
179  StrongWolfeLineMinimization( Multifunc const & score_fxn, bool nonmonotone, Size dim ) :
180  LineMinimizationAlgorithm( score_fxn, dim ),
181  _nonmonotone( nonmonotone ),
182  _num_calls( 0 ) {};
183  virtual bool provide_stored_derivatives(){ return true; };
184  virtual Real operator()( Multivec & curr_pos, Multivec & curr_dir );
185  Real StrongWolfe( Real init_step, func_1d & func_eval );
186  Real zoom( Real alpha_low, Real func_low, Real deriv_low, Real alpha_high, Real func_high, Real deriv_high,
187  Real func_zero, Real deriv_zero, Real & func_return, func_1d & func_eval );
190 };
191 
192 } // namespace optimization
193 } // namespace core
194 
195 
196 #endif // INCLUDED_core_optimization_LineMinimizer_HH