go home Home | Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Namespace Members | Data Fields | Globals | Related Pages
itkMoreThuenteLineSearchOptimizer.h
Go to the documentation of this file.
1 /*======================================================================
2 
3  This file is part of the elastix software.
4 
5  Copyright (c) University Medical Center Utrecht. All rights reserved.
6  See src/CopyrightElastix.txt or http://elastix.isi.uu.nl/legal.php for
7  details.
8 
9  This software is distributed WITHOUT ANY WARRANTY; without even
10  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11  PURPOSE. See the above copyright notices for more information.
12 
13 ======================================================================*/
14 
15 #ifndef __itkMoreThuenteLineSearchOptimizer_h
16 #define __itkMoreThuenteLineSearchOptimizer_h
17 
18 #include "itkLineSearchOptimizer.h"
19 
20 namespace itk
21 {
68 {
69 public:
70 
73  typedef SmartPointer< Self > Pointer;
74  typedef SmartPointer< const Self > ConstPointer;
75 
76  itkNewMacro( Self );
78 
83 
84  typedef enum {
95 
96  virtual void StartOptimization( void );
97 
98  virtual void StopOptimization( void );
99 
103  virtual void SetInitialDerivative( const DerivativeType & derivative );
104 
105  virtual void SetInitialValue( MeasureType value );
106 
110  virtual void GetCurrentValueAndDerivative(
111  MeasureType & value, DerivativeType & derivative ) const;
112 
113  virtual void GetCurrentDerivative( DerivativeType & derivative ) const;
114 
115  virtual MeasureType GetCurrentValue( void ) const;
116 
117  virtual double GetCurrentDirectionalDerivative( void ) const;
118 
120  itkGetConstMacro( CurrentIteration, unsigned long );
121  itkGetConstReferenceMacro( StopCondition, StopConditionType );
122  itkGetConstMacro( SufficientDecreaseConditionSatisfied, bool );
123  itkGetConstMacro( CurvatureConditionSatisfied, bool );
124 
126  itkGetConstMacro( MaximumNumberOfIterations, unsigned long );
127  itkSetClampMacro( MaximumNumberOfIterations, unsigned long,
129 
139  itkSetClampMacro( ValueTolerance, double, 0.0, NumericTraits< double >::max() );
140  itkGetConstMacro( ValueTolerance, double );
141 
151  itkSetClampMacro( GradientTolerance, double, 0.0, NumericTraits< double >::max() );
152  itkGetConstMacro( GradientTolerance, double );
153 
162  itkSetClampMacro( IntervalTolerance, double, 0.0, NumericTraits< double >::max() );
163  itkGetConstMacro( IntervalTolerance, double );
164 
165 protected:
166 
169 
170  void PrintSelf( std::ostream & os, Indent indent ) const;
171 
172  unsigned long m_CurrentIteration;
176  bool m_Stop;
179 
181  virtual void GetInitialValueAndDerivative( void );
182 
184  virtual int CheckSettings( void );
185 
187  virtual void InitializeLineSearch( void );
188 
192  virtual void UpdateIntervalMinimumAndMaximum( void );
193 
195  void BoundStep( double & step ) const;
196 
198  virtual void PrepareForUnusualTermination( void );
199 
201  virtual void ComputeCurrentValueAndDerivative( void );
202 
204  virtual void TestConvergence( bool & stop );
205 
207  virtual void ComputeNewStepAndInterval( void );
208 
210  virtual void ForceSufficientDecreaseInIntervalWidth( void );
211 
215  virtual int SafeGuardedStep(
216  double & stx, double & fx, double & dx,
217  double & sty, double & fy, double & dy,
218  double & stp, const double & fp, const double & dp,
219  bool & brackt,
220  const double & stpmin, const double & stpmax ) const;
221 
222  double m_step;
223  double m_stepx;
224  double m_stepy;
225  double m_stepmin;
226  double m_stepmax;
227 
228  MeasureType m_f; // CurrentValue
232 
233  DerivativeType m_g; // CurrentDerivative
234  double m_dg; // CurrentDirectionalDerivative
235  double m_dginit;
236  double m_dgx;
237  double m_dgy;
238  double m_dgtest;
239 
240  double m_width;
241  double m_width1;
242 
243  bool m_brackt;
244  bool m_stage1;
246 
247 private:
248 
249  MoreThuenteLineSearchOptimizer( const Self & ); // purposely not implemented
250  void operator=( const Self & ); // purposely not implemented
251 
256 
257 };
258 
259 } // end namespace itk
260 
267 /* SUBROUTINE MCSRCH */
268 
269 /* A slight modification of the subroutine CSRCH of More' and Thuente. */
270 /* The changes are to allow reverse communication, and do not affect */
271 /* the performance of the routine. */
272 
273 /* THE PURPOSE OF MCSRCH IS TO FIND A STEP WHICH SATISFIES */
274 /* A SUFFICIENT DECREASE CONDITION AND A CURVATURE CONDITION. */
275 
276 /* AT EACH STAGE THE SUBROUTINE UPDATES AN INTERVAL OF */
277 /* UNCERTAINTY WITH ENDPOINTS STX AND STY. THE INTERVAL OF */
278 /* UNCERTAINTY IS INITIALLY CHOSEN SO THAT IT CONTAINS A */
279 /* MINIMIZER OF THE MODIFIED FUNCTION */
280 
281 /* F(X+STP*S) - F(X) - FTOL*STP*(GRADF(X)'S). */
282 
283 /* IF A STEP IS OBTAINED FOR WHICH THE MODIFIED FUNCTION */
284 /* HAS A NONPOSITIVE FUNCTION VALUE AND NONNEGATIVE DERIVATIVE, */
285 /* THEN THE INTERVAL OF UNCERTAINTY IS CHOSEN SO THAT IT */
286 /* CONTAINS A MINIMIZER OF F(X+STP*S). */
287 
288 /* THE ALGORITHM IS DESIGNED TO FIND A STEP WHICH SATISFIES */
289 /* THE SUFFICIENT DECREASE CONDITION */
290 
291 /* F(X+STP*S) .LE. F(X) + FTOL*STP*(GRADF(X)'S), */
292 
293 /* AND THE CURVATURE CONDITION */
294 
295 /* ABS(GRADF(X+STP*S)'S)) .LE. GTOL*ABS(GRADF(X)'S). */
296 
297 /* IF FTOL IS LESS THAN GTOL AND IF, FOR EXAMPLE, THE FUNCTION */
298 /* IS BOUNDED BELOW, THEN THERE IS ALWAYS A STEP WHICH SATISFIES */
299 /* BOTH CONDITIONS. IF NO STEP CAN BE FOUND WHICH SATISFIES BOTH */
300 /* CONDITIONS, THEN THE ALGORITHM USUALLY STOPS WHEN ROUNDING */
301 /* ERRORS PREVENT FURTHER PROGRESS. IN THIS CASE STP ONLY */
302 /* SATISFIES THE SUFFICIENT DECREASE CONDITION. */
303 
304 /* THE SUBROUTINE STATEMENT IS */
305 
306 /* SUBROUTINE MCSRCH(N,X,F,G,S,STP,FTOL,XTOL, MAXFEV,INFO,NFEV,WA) */
307 /* WHERE */
308 
309 /* N IS A POSITIVE INTEGER INPUT VARIABLE SET TO THE NUMBER */
310 /* OF VARIABLES. */
311 
312 /* X IS AN ARRAY OF LENGTH N. ON INPUT IT MUST CONTAIN THE */
313 /* BASE POINT FOR THE LINE SEARCH. ON OUTPUT IT CONTAINS */
314 /* X + STP*S. */
315 
316 /* F IS A VARIABLE. ON INPUT IT MUST CONTAIN THE VALUE OF F */
317 /* AT X. ON OUTPUT IT CONTAINS THE VALUE OF F AT X + STP*S. */
318 
319 /* G IS AN ARRAY OF LENGTH N. ON INPUT IT MUST CONTAIN THE */
320 /* GRADIENT OF F AT X. ON OUTPUT IT CONTAINS THE GRADIENT */
321 /* OF F AT X + STP*S. */
322 
323 /* S IS AN INPUT ARRAY OF LENGTH N WHICH SPECIFIES THE */
324 /* SEARCH DIRECTION. */
325 
326 /* STP IS A NONNEGATIVE VARIABLE. ON INPUT STP CONTAINS AN */
327 /* INITIAL ESTIMATE OF A SATISFACTORY STEP. ON OUTPUT */
328 /* STP CONTAINS THE FINAL ESTIMATE. */
329 
330 /* FTOL AND GTOL ARE NONNEGATIVE INPUT VARIABLES. (In this reverse */
331 /* communication implementation GTOL is defined in a COMMON */
332 /* statement.) TERMINATION OCCURS WHEN THE SUFFICIENT DECREASE */
333 /* CONDITION AND THE DIRECTIONAL DERIVATIVE CONDITION ARE */
334 /* SATISFIED. */
335 
336 /* XTOL IS A NONNEGATIVE INPUT VARIABLE. TERMINATION OCCURS */
337 /* WHEN THE RELATIVE WIDTH OF THE INTERVAL OF UNCERTAINTY */
338 /* IS AT MOST XTOL. */
339 
340 /* STPMIN AND STPMAX ARE NONNEGATIVE INPUT VARIABLES WHICH */
341 /* SPECIFY LOWER AND UPPER BOUNDS FOR THE STEP. (In this reverse */
342 /* communication implementatin they are defined in a COMMON */
343 /* statement). */
344 
345 /* MAXFEV IS A POSITIVE INTEGER INPUT VARIABLE. TERMINATION */
346 /* OCCURS WHEN THE NUMBER OF CALLS TO FCN IS AT LEAST */
347 /* MAXFEV BY THE END OF AN ITERATION. */
348 
349 /* INFO IS AN INTEGER OUTPUT VARIABLE SET AS FOLLOWS: */
350 
351 /* INFO = 0 IMPROPER INPUT PARAMETERS. */
352 
353 /* INFO =-1 A RETURN IS MADE TO COMPUTE THE FUNCTION AND GRADIENT. */
354 /* NFEV IS AN INTEGER OUTPUT VARIABLE SET TO THE NUMBER OF */
355 /* CALLS TO FCN. */
356 
357 /* WA IS A WORK ARRAY OF LENGTH N. */
358 
359 /* SUBPROGRAMS CALLED */
360 
361 /* MCSTEP */
362 
363 /* FORTRAN-SUPPLIED...ABS,MAX,MIN */
364 
365 /* ARGONNE NATIONAL LABORATORY. MINPACK PROJECT. JUNE 1983 */
366 /* JORGE J. MORE', DAVID J. THUENTE */
367 
368 /* ********** */
369 
370 #endif // #ifndef __itkMoreThuenteLineSearchOptimizer_h
virtual MeasureType GetCurrentValue(void) const
virtual int SafeGuardedStep(double &stx, double &fx, double &dx, double &sty, double &fy, double &dy, double &stp, const double &fp, const double &dp, bool &brackt, const double &stpmin, const double &stpmax) const
virtual void GetInitialValueAndDerivative(void)
virtual void GetCurrentDerivative(DerivativeType &derivative) const
virtual void SetInitialValue(MeasureType value)
ITK version of the MoreThuente line search algorithm.
virtual void UpdateIntervalMinimumAndMaximum(void)
virtual void InitializeLineSearch(void)
virtual void TestConvergence(bool &stop)
virtual void StartOptimization(void)
virtual double GetCurrentDirectionalDerivative(void) const
int max(int a, int b)
void PrintSelf(std::ostream &os, Indent indent) const
virtual void ComputeCurrentValueAndDerivative(void)
virtual void PrepareForUnusualTermination(void)
virtual void GetCurrentValueAndDerivative(MeasureType &value, DerivativeType &derivative) const
A base class for LineSearch optimizers.
Superclass::DerivativeType DerivativeType
virtual void ComputeNewStepAndInterval(void)
virtual void SetInitialDerivative(const DerivativeType &derivative)
Superclass::CostFunctionType CostFunctionType
Superclass::MeasureType MeasureType
virtual void ForceSufficientDecreaseInIntervalWidth(void)
void BoundStep(double &step) const
Superclass::ParametersType ParametersType


Generated on 27-04-2014 for elastix by doxygen 1.8.6 elastix logo