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.
00001 /*======================================================================
00002 
00003   This file is part of the elastix software.
00004 
00005   Copyright (c) University Medical Center Utrecht. All rights reserved.
00006   See src/CopyrightElastix.txt or http://elastix.isi.uu.nl/legal.php for
00007   details.
00008 
00009      This software is distributed WITHOUT ANY WARRANTY; without even
00010      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00011      PURPOSE. See the above copyright notices for more information.
00012 
00013 ======================================================================*/
00014 
00015 #ifndef __itkMoreThuenteLineSearchOptimizer_h
00016 #define __itkMoreThuenteLineSearchOptimizer_h
00017 
00018 #include "itkLineSearchOptimizer.h"
00019 
00020 namespace itk
00021 {
00067 class MoreThuenteLineSearchOptimizer : public LineSearchOptimizer
00068 {
00069 public:
00070   typedef MoreThuenteLineSearchOptimizer  Self;
00071   typedef LineSearchOptimizer             Superclass;
00072   typedef SmartPointer<Self>              Pointer;
00073   typedef SmartPointer<const Self>        ConstPointer;
00074 
00075   itkNewMacro( Self );
00076   itkTypeMacro( MoreThuenteLineSearchOptimizer, LineSearchOptimizer );
00077 
00078   typedef Superclass::MeasureType               MeasureType;
00079   typedef Superclass::ParametersType            ParametersType;
00080   typedef Superclass::DerivativeType            DerivativeType;
00081   typedef Superclass::CostFunctionType          CostFunctionType;
00082 
00083   typedef enum {
00084     StrongWolfeConditionsSatisfied,
00085     MetricError,
00086     MaximumNumberOfIterations,
00087     StepTooSmall,
00088     StepTooLarge,
00089     IntervalTooSmall,
00090     RoundingError,
00091     AscentSearchDirection,
00092     Unknown }                                   StopConditionType;
00093 
00094   virtual void StartOptimization( void );
00095   virtual void StopOptimization( void );
00096 
00100   virtual void SetInitialDerivative( const DerivativeType & derivative );
00101   virtual void SetInitialValue( MeasureType value );
00102 
00106   virtual void GetCurrentValueAndDerivative(
00107     MeasureType & value, DerivativeType & derivative ) const;
00108   virtual void GetCurrentDerivative( DerivativeType & derivative ) const;
00109   virtual MeasureType GetCurrentValue( void ) const;
00110   virtual double GetCurrentDirectionalDerivative( void ) const;
00111 
00113   itkGetConstMacro( CurrentIteration, unsigned long );
00114   itkGetConstReferenceMacro( StopCondition, StopConditionType );
00115   itkGetConstMacro( SufficientDecreaseConditionSatisfied, bool );
00116   itkGetConstMacro( CurvatureConditionSatisfied, bool );
00117 
00119   itkGetConstMacro( MaximumNumberOfIterations, unsigned long );
00120   itkSetClampMacro( MaximumNumberOfIterations, unsigned long,
00121     1, NumericTraits<unsigned long>::max() );
00122 
00132   itkSetClampMacro( ValueTolerance, double, 0.0, NumericTraits<double>::max() );
00133   itkGetConstMacro( ValueTolerance, double );
00134 
00144   itkSetClampMacro( GradientTolerance, double, 0.0, NumericTraits<double>::max() );
00145   itkGetConstMacro( GradientTolerance, double );
00146 
00155   itkSetClampMacro( IntervalTolerance, double, 0.0, NumericTraits<double>::max() );
00156   itkGetConstMacro( IntervalTolerance, double );
00157 
00158 protected:
00159   MoreThuenteLineSearchOptimizer();
00160   virtual ~MoreThuenteLineSearchOptimizer() {};
00161 
00162   void PrintSelf( std::ostream& os, Indent indent ) const;
00163 
00164   unsigned long     m_CurrentIteration;
00165   bool              m_InitialDerivativeProvided;
00166   bool              m_InitialValueProvided;
00167   StopConditionType m_StopCondition;
00168   bool              m_Stop;
00169   bool              m_SufficientDecreaseConditionSatisfied;
00170   bool              m_CurvatureConditionSatisfied;
00171 
00173   virtual void GetInitialValueAndDerivative( void );
00174 
00176   virtual int CheckSettings( void );
00177 
00179   virtual void InitializeLineSearch( void );
00180 
00184   virtual void UpdateIntervalMinimumAndMaximum( void );
00185 
00187   void BoundStep( double & step ) const;
00188 
00190   virtual void PrepareForUnusualTermination( void );
00191 
00193   virtual void ComputeCurrentValueAndDerivative( void );
00194 
00196   virtual void TestConvergence( bool & stop );
00197 
00199   virtual void ComputeNewStepAndInterval( void );
00200 
00202   virtual void ForceSufficientDecreaseInIntervalWidth( void );
00203 
00207   virtual int SafeGuardedStep(
00208     double & stx, double & fx, double & dx,
00209     double & sty, double & fy, double & dy,
00210     double & stp, const double & fp, const double & dp,
00211     bool & brackt,
00212     const double & stpmin, const double & stpmax ) const;
00213 
00214   double m_step;
00215   double m_stepx;
00216   double m_stepy;
00217   double m_stepmin;
00218   double m_stepmax;
00219 
00220   MeasureType m_f;  // CurrentValue
00221   MeasureType m_fx;
00222   MeasureType m_fy;
00223   MeasureType m_finit;
00224 
00225   DerivativeType m_g; // CurrentDerivative
00226   double m_dg; // CurrentDirectionalDerivative
00227   double m_dginit;
00228   double m_dgx;
00229   double m_dgy;
00230   double m_dgtest;
00231 
00232   double m_width;
00233   double m_width1;
00234 
00235   bool m_brackt;
00236   bool m_stage1;
00237   bool m_SafeGuardedStepFailed;
00238 
00239 private:
00240   MoreThuenteLineSearchOptimizer(const Self&); //purposely not implemented
00241   void operator=(const Self&); //purposely not implemented
00242 
00243   unsigned long     m_MaximumNumberOfIterations;
00244   double            m_ValueTolerance;
00245   double            m_GradientTolerance;
00246   double            m_IntervalTolerance;
00247 
00248 }; // end class MoreThuenteLineSearchOptimizer
00249 
00250 
00251 } // end namespace itk
00252 
00253 
00260 /*                     SUBROUTINE MCSRCH */
00261 
00262 /*     A slight modification of the subroutine CSRCH of More' and Thuente. */
00263 /*     The changes are to allow reverse communication, and do not affect */
00264 /*     the performance of the routine. */
00265 
00266 /*     THE PURPOSE OF MCSRCH IS TO FIND A STEP WHICH SATISFIES */
00267 /*     A SUFFICIENT DECREASE CONDITION AND A CURVATURE CONDITION. */
00268 
00269 /*     AT EACH STAGE THE SUBROUTINE UPDATES AN INTERVAL OF */
00270 /*     UNCERTAINTY WITH ENDPOINTS STX AND STY. THE INTERVAL OF */
00271 /*     UNCERTAINTY IS INITIALLY CHOSEN SO THAT IT CONTAINS A */
00272 /*     MINIMIZER OF THE MODIFIED FUNCTION */
00273 
00274 /*          F(X+STP*S) - F(X) - FTOL*STP*(GRADF(X)'S). */
00275 
00276 /*     IF A STEP IS OBTAINED FOR WHICH THE MODIFIED FUNCTION */
00277 /*     HAS A NONPOSITIVE FUNCTION VALUE AND NONNEGATIVE DERIVATIVE, */
00278 /*     THEN THE INTERVAL OF UNCERTAINTY IS CHOSEN SO THAT IT */
00279 /*     CONTAINS A MINIMIZER OF F(X+STP*S). */
00280 
00281 /*     THE ALGORITHM IS DESIGNED TO FIND A STEP WHICH SATISFIES */
00282 /*     THE SUFFICIENT DECREASE CONDITION */
00283 
00284 /*           F(X+STP*S) .LE. F(X) + FTOL*STP*(GRADF(X)'S), */
00285 
00286 /*     AND THE CURVATURE CONDITION */
00287 
00288 /*           ABS(GRADF(X+STP*S)'S)) .LE. GTOL*ABS(GRADF(X)'S). */
00289 
00290 /*     IF FTOL IS LESS THAN GTOL AND IF, FOR EXAMPLE, THE FUNCTION */
00291 /*     IS BOUNDED BELOW, THEN THERE IS ALWAYS A STEP WHICH SATISFIES */
00292 /*     BOTH CONDITIONS. IF NO STEP CAN BE FOUND WHICH SATISFIES BOTH */
00293 /*     CONDITIONS, THEN THE ALGORITHM USUALLY STOPS WHEN ROUNDING */
00294 /*     ERRORS PREVENT FURTHER PROGRESS. IN THIS CASE STP ONLY */
00295 /*     SATISFIES THE SUFFICIENT DECREASE CONDITION. */
00296 
00297 /*     THE SUBROUTINE STATEMENT IS */
00298 
00299 /*        SUBROUTINE MCSRCH(N,X,F,G,S,STP,FTOL,XTOL, MAXFEV,INFO,NFEV,WA) */
00300 /*     WHERE */
00301 
00302 /*       N IS A POSITIVE INTEGER INPUT VARIABLE SET TO THE NUMBER */
00303 /*         OF VARIABLES. */
00304 
00305 /*       X IS AN ARRAY OF LENGTH N. ON INPUT IT MUST CONTAIN THE */
00306 /*         BASE POINT FOR THE LINE SEARCH. ON OUTPUT IT CONTAINS */
00307 /*         X + STP*S. */
00308 
00309 /*       F IS A VARIABLE. ON INPUT IT MUST CONTAIN THE VALUE OF F */
00310 /*         AT X. ON OUTPUT IT CONTAINS THE VALUE OF F AT X + STP*S. */
00311 
00312 /*       G IS AN ARRAY OF LENGTH N. ON INPUT IT MUST CONTAIN THE */
00313 /*         GRADIENT OF F AT X. ON OUTPUT IT CONTAINS THE GRADIENT */
00314 /*         OF F AT X + STP*S. */
00315 
00316 /*       S IS AN INPUT ARRAY OF LENGTH N WHICH SPECIFIES THE */
00317 /*         SEARCH DIRECTION. */
00318 
00319 /*       STP IS A NONNEGATIVE VARIABLE. ON INPUT STP CONTAINS AN */
00320 /*         INITIAL ESTIMATE OF A SATISFACTORY STEP. ON OUTPUT */
00321 /*         STP CONTAINS THE FINAL ESTIMATE. */
00322 
00323 /*       FTOL AND GTOL ARE NONNEGATIVE INPUT VARIABLES. (In this reverse */
00324 /*         communication implementation GTOL is defined in a COMMON */
00325 /*         statement.) TERMINATION OCCURS WHEN THE SUFFICIENT DECREASE */
00326 /*         CONDITION AND THE DIRECTIONAL DERIVATIVE CONDITION ARE */
00327 /*         SATISFIED. */
00328 
00329 /*       XTOL IS A NONNEGATIVE INPUT VARIABLE. TERMINATION OCCURS */
00330 /*         WHEN THE RELATIVE WIDTH OF THE INTERVAL OF UNCERTAINTY */
00331 /*         IS AT MOST XTOL. */
00332 
00333 /*       STPMIN AND STPMAX ARE NONNEGATIVE INPUT VARIABLES WHICH */
00334 /*         SPECIFY LOWER AND UPPER BOUNDS FOR THE STEP. (In this reverse */
00335 /*         communication implementatin they are defined in a COMMON */
00336 /*         statement). */
00337 
00338 /*       MAXFEV IS A POSITIVE INTEGER INPUT VARIABLE. TERMINATION */
00339 /*         OCCURS WHEN THE NUMBER OF CALLS TO FCN IS AT LEAST */
00340 /*         MAXFEV BY THE END OF AN ITERATION. */
00341 
00342 /*       INFO IS AN INTEGER OUTPUT VARIABLE SET AS FOLLOWS: */
00343 
00344 /*         INFO = 0  IMPROPER INPUT PARAMETERS. */
00345 
00346 /*        INFO =-1  A RETURN IS MADE TO COMPUTE THE FUNCTION AND GRADIENT.  */
00347 /*       NFEV IS AN INTEGER OUTPUT VARIABLE SET TO THE NUMBER OF */
00348 /*         CALLS TO FCN. */
00349 
00350 /*       WA IS A WORK ARRAY OF LENGTH N. */
00351 
00352 /*     SUBPROGRAMS CALLED */
00353 
00354 /*       MCSTEP */
00355 
00356 /*       FORTRAN-SUPPLIED...ABS,MAX,MIN */
00357 
00358 /*     ARGONNE NATIONAL LABORATORY. MINPACK PROJECT. JUNE 1983 */
00359 /*     JORGE J. MORE', DAVID J. THUENTE */
00360 
00361 /*     ********** */
00362 
00363 
00364 #endif // #ifndef __itkMoreThuenteLineSearchOptimizer_h
00365 


Generated on 24-10-2011 for elastix by doxygen 1.7.4 elastix logo