00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkRegularStepGradientDescentBaseOptimizer_h
00018 #define __itkRegularStepGradientDescentBaseOptimizer_h
00019
00020 #include "itkSingleValuedNonLinearOptimizer.h"
00021
00022 namespace itk
00023 {
00024
00030 class ITK_EXPORT RegularStepGradientDescentBaseOptimizer :
00031 public SingleValuedNonLinearOptimizer
00032 {
00033 public:
00035 typedef RegularStepGradientDescentBaseOptimizer Self;
00036 typedef SingleValuedNonLinearOptimizer Superclass;
00037 typedef SmartPointer<Self> Pointer;
00038 typedef SmartPointer<const Self> ConstPointer;
00039
00041 itkNewMacro(Self);
00042
00044 itkTypeMacro( RegularStepGradientDescentBaseOptimizer,
00045 SingleValuedNonLinearOptimizer );
00046
00047
00049 typedef enum {
00050 GradientMagnitudeTolerance=1,
00051 StepTooSmall,
00052 ImageNotAvailable,
00053 SamplesNotAvailable,
00054 MaximumNumberOfIterations
00055 } StopConditionType;
00056
00058 itkSetMacro( Maximize, bool );
00059 itkGetMacro( Maximize, bool );
00060 itkBooleanMacro( Maximize );
00061 bool GetMinimize( ) const
00062 { return !m_Maximize; }
00063 void SetMinimize(bool v)
00064 { this->SetMaximize(!v); }
00065 void MinimizeOn(void)
00066 { SetMaximize( false ); }
00067 void MinimizeOff(void)
00068 { SetMaximize( true ); }
00069
00071 void StartOptimization( void );
00072
00075 void ResumeOptimization( void );
00076
00079 void StopOptimization( void );
00080
00082 itkSetMacro( MaximumStepLength, double );
00083 itkSetMacro( MinimumStepLength, double );
00084 itkSetMacro( NumberOfIterations, unsigned long );
00085 itkSetMacro( GradientMagnitudeTolerance, double );
00086 itkGetConstMacro( CurrentStepLength, double);
00087 itkGetConstMacro( MaximumStepLength, double );
00088 itkGetConstMacro( MinimumStepLength, double );
00089 itkGetConstMacro( NumberOfIterations, unsigned long );
00090 itkGetConstMacro( GradientMagnitudeTolerance, double );
00091 itkGetConstMacro( CurrentIteration, unsigned int );
00092 itkGetConstMacro( StopCondition, StopConditionType );
00093 itkGetConstMacro( Value, MeasureType );
00094
00095
00096 protected:
00097 RegularStepGradientDescentBaseOptimizer();
00098 virtual ~RegularStepGradientDescentBaseOptimizer() {};
00099 void PrintSelf(std::ostream& os, Indent indent) const;
00100
00104 virtual void AdvanceOneStep( void );
00105
00111 virtual void StepAlongGradient(
00112 double factor,
00113 const DerivativeType & transformedGradient )
00114 {
00115 ExceptionObject ex;
00116 ex.SetLocation(__FILE__);
00117 ex.SetDescription("This method MUST be overloaded in derived classes");
00118 throw ex;
00119 }
00120
00121
00122 private:
00123 RegularStepGradientDescentBaseOptimizer(const Self&);
00124 void operator=(const Self&);
00125
00126 protected:
00127 DerivativeType m_Gradient;
00128 DerivativeType m_PreviousGradient;
00129
00130 bool m_Stop;
00131 bool m_Maximize;
00132 MeasureType m_Value;
00133 double m_GradientMagnitudeTolerance;
00134 double m_MaximumStepLength;
00135 double m_MinimumStepLength;
00136 double m_CurrentStepLength;
00137 StopConditionType m_StopCondition;
00138 unsigned long m_NumberOfIterations;
00139 unsigned long m_CurrentIteration;
00140
00141
00142 };
00143
00144 }
00145
00146
00147
00148 #endif
00149
00150
00151