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:
72  typedef SmartPointer<Self> Pointer;
73  typedef SmartPointer<const Self> ConstPointer;
74 
75  itkNewMacro( Self );
77 
82 
83  typedef enum {
93 
94  virtual void StartOptimization( void );
95  virtual void StopOptimization( void );
96 
100  virtual void SetInitialDerivative( const DerivativeType & derivative );
101  virtual void SetInitialValue( MeasureType value );
102 
106  virtual void GetCurrentValueAndDerivative(
107  MeasureType & value, DerivativeType & derivative ) const;
108  virtual void GetCurrentDerivative( DerivativeType & derivative ) const;
109  virtual MeasureType GetCurrentValue( void ) const;
110  virtual double GetCurrentDirectionalDerivative( void ) const;
111 
113  itkGetConstMacro( CurrentIteration, unsigned long );
114  itkGetConstReferenceMacro( StopCondition, StopConditionType );
115  itkGetConstMacro( SufficientDecreaseConditionSatisfied, bool );
116  itkGetConstMacro( CurvatureConditionSatisfied, bool );
117 
119  itkGetConstMacro( MaximumNumberOfIterations, unsigned long );
120  itkSetClampMacro( MaximumNumberOfIterations, unsigned long,
122 
132  itkSetClampMacro( ValueTolerance, double, 0.0, NumericTraits<double>::max() );
133  itkGetConstMacro( ValueTolerance, double );
134 
144  itkSetClampMacro( GradientTolerance, double, 0.0, NumericTraits<double>::max() );
145  itkGetConstMacro( GradientTolerance, double );
146 
155  itkSetClampMacro( IntervalTolerance, double, 0.0, NumericTraits<double>::max() );
156  itkGetConstMacro( IntervalTolerance, double );
157 
158 protected:
161 
162  void PrintSelf( std::ostream& os, Indent indent ) const;
163 
164  unsigned long m_CurrentIteration;
168  bool m_Stop;
171 
173  virtual void GetInitialValueAndDerivative( void );
174 
176  virtual int CheckSettings( void );
177 
179  virtual void InitializeLineSearch( void );
180 
184  virtual void UpdateIntervalMinimumAndMaximum( void );
185 
187  void BoundStep( double & step ) const;
188 
190  virtual void PrepareForUnusualTermination( void );
191 
193  virtual void ComputeCurrentValueAndDerivative( void );
194 
196  virtual void TestConvergence( bool & stop );
197 
199  virtual void ComputeNewStepAndInterval( void );
200 
202  virtual void ForceSufficientDecreaseInIntervalWidth( void );
203 
207  virtual int SafeGuardedStep(
208  double & stx, double & fx, double & dx,
209  double & sty, double & fy, double & dy,
210  double & stp, const double & fp, const double & dp,
211  bool & brackt,
212  const double & stpmin, const double & stpmax ) const;
213 
214  double m_step;
215  double m_stepx;
216  double m_stepy;
217  double m_stepmin;
218  double m_stepmax;
219 
220  MeasureType m_f; // CurrentValue
224 
225  DerivativeType m_g; // CurrentDerivative
226  double m_dg; // CurrentDirectionalDerivative
227  double m_dginit;
228  double m_dgx;
229  double m_dgy;
230  double m_dgtest;
231 
232  double m_width;
233  double m_width1;
234 
235  bool m_brackt;
236  bool m_stage1;
238 
239 private:
240  MoreThuenteLineSearchOptimizer(const Self&); //purposely not implemented
241  void operator=(const Self&); //purposely not implemented
242 
247 
248 }; // end class MoreThuenteLineSearchOptimizer
249 
250 
251 } // end namespace itk
252 
253 
260 /* SUBROUTINE MCSRCH */
261 
262 /* A slight modification of the subroutine CSRCH of More' and Thuente. */
263 /* The changes are to allow reverse communication, and do not affect */
264 /* the performance of the routine. */
265 
266 /* THE PURPOSE OF MCSRCH IS TO FIND A STEP WHICH SATISFIES */
267 /* A SUFFICIENT DECREASE CONDITION AND A CURVATURE CONDITION. */
268 
269 /* AT EACH STAGE THE SUBROUTINE UPDATES AN INTERVAL OF */
270 /* UNCERTAINTY WITH ENDPOINTS STX AND STY. THE INTERVAL OF */
271 /* UNCERTAINTY IS INITIALLY CHOSEN SO THAT IT CONTAINS A */
272 /* MINIMIZER OF THE MODIFIED FUNCTION */
273 
274 /* F(X+STP*S) - F(X) - FTOL*STP*(GRADF(X)'S). */
275 
276 /* IF A STEP IS OBTAINED FOR WHICH THE MODIFIED FUNCTION */
277 /* HAS A NONPOSITIVE FUNCTION VALUE AND NONNEGATIVE DERIVATIVE, */
278 /* THEN THE INTERVAL OF UNCERTAINTY IS CHOSEN SO THAT IT */
279 /* CONTAINS A MINIMIZER OF F(X+STP*S). */
280 
281 /* THE ALGORITHM IS DESIGNED TO FIND A STEP WHICH SATISFIES */
282 /* THE SUFFICIENT DECREASE CONDITION */
283 
284 /* F(X+STP*S) .LE. F(X) + FTOL*STP*(GRADF(X)'S), */
285 
286 /* AND THE CURVATURE CONDITION */
287 
288 /* ABS(GRADF(X+STP*S)'S)) .LE. GTOL*ABS(GRADF(X)'S). */
289 
290 /* IF FTOL IS LESS THAN GTOL AND IF, FOR EXAMPLE, THE FUNCTION */
291 /* IS BOUNDED BELOW, THEN THERE IS ALWAYS A STEP WHICH SATISFIES */
292 /* BOTH CONDITIONS. IF NO STEP CAN BE FOUND WHICH SATISFIES BOTH */
293 /* CONDITIONS, THEN THE ALGORITHM USUALLY STOPS WHEN ROUNDING */
294 /* ERRORS PREVENT FURTHER PROGRESS. IN THIS CASE STP ONLY */
295 /* SATISFIES THE SUFFICIENT DECREASE CONDITION. */
296 
297 /* THE SUBROUTINE STATEMENT IS */
298 
299 /* SUBROUTINE MCSRCH(N,X,F,G,S,STP,FTOL,XTOL, MAXFEV,INFO,NFEV,WA) */
300 /* WHERE */
301 
302 /* N IS A POSITIVE INTEGER INPUT VARIABLE SET TO THE NUMBER */
303 /* OF VARIABLES. */
304 
305 /* X IS AN ARRAY OF LENGTH N. ON INPUT IT MUST CONTAIN THE */
306 /* BASE POINT FOR THE LINE SEARCH. ON OUTPUT IT CONTAINS */
307 /* X + STP*S. */
308 
309 /* F IS A VARIABLE. ON INPUT IT MUST CONTAIN THE VALUE OF F */
310 /* AT X. ON OUTPUT IT CONTAINS THE VALUE OF F AT X + STP*S. */
311 
312 /* G IS AN ARRAY OF LENGTH N. ON INPUT IT MUST CONTAIN THE */
313 /* GRADIENT OF F AT X. ON OUTPUT IT CONTAINS THE GRADIENT */
314 /* OF F AT X + STP*S. */
315 
316 /* S IS AN INPUT ARRAY OF LENGTH N WHICH SPECIFIES THE */
317 /* SEARCH DIRECTION. */
318 
319 /* STP IS A NONNEGATIVE VARIABLE. ON INPUT STP CONTAINS AN */
320 /* INITIAL ESTIMATE OF A SATISFACTORY STEP. ON OUTPUT */
321 /* STP CONTAINS THE FINAL ESTIMATE. */
322 
323 /* FTOL AND GTOL ARE NONNEGATIVE INPUT VARIABLES. (In this reverse */
324 /* communication implementation GTOL is defined in a COMMON */
325 /* statement.) TERMINATION OCCURS WHEN THE SUFFICIENT DECREASE */
326 /* CONDITION AND THE DIRECTIONAL DERIVATIVE CONDITION ARE */
327 /* SATISFIED. */
328 
329 /* XTOL IS A NONNEGATIVE INPUT VARIABLE. TERMINATION OCCURS */
330 /* WHEN THE RELATIVE WIDTH OF THE INTERVAL OF UNCERTAINTY */
331 /* IS AT MOST XTOL. */
332 
333 /* STPMIN AND STPMAX ARE NONNEGATIVE INPUT VARIABLES WHICH */
334 /* SPECIFY LOWER AND UPPER BOUNDS FOR THE STEP. (In this reverse */
335 /* communication implementatin they are defined in a COMMON */
336 /* statement). */
337 
338 /* MAXFEV IS A POSITIVE INTEGER INPUT VARIABLE. TERMINATION */
339 /* OCCURS WHEN THE NUMBER OF CALLS TO FCN IS AT LEAST */
340 /* MAXFEV BY THE END OF AN ITERATION. */
341 
342 /* INFO IS AN INTEGER OUTPUT VARIABLE SET AS FOLLOWS: */
343 
344 /* INFO = 0 IMPROPER INPUT PARAMETERS. */
345 
346 /* INFO =-1 A RETURN IS MADE TO COMPUTE THE FUNCTION AND GRADIENT. */
347 /* NFEV IS AN INTEGER OUTPUT VARIABLE SET TO THE NUMBER OF */
348 /* CALLS TO FCN. */
349 
350 /* WA IS A WORK ARRAY OF LENGTH N. */
351 
352 /* SUBPROGRAMS CALLED */
353 
354 /* MCSTEP */
355 
356 /* FORTRAN-SUPPLIED...ABS,MAX,MIN */
357 
358 /* ARGONNE NATIONAL LABORATORY. MINPACK PROJECT. JUNE 1983 */
359 /* JORGE J. MORE', DAVID J. THUENTE */
360 
361 /* ********** */
362 
363 
364 #endif // #ifndef __itkMoreThuenteLineSearchOptimizer_h
365 


Generated on 21-03-2014 for elastix by doxygen 1.8.1.2 elastix logo