00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "freSPSASOOptimizer.h"
00024 #include "itkCommand.h"
00025 #include "itkEventObject.h"
00026
00027 namespace FREE
00028 {
00029
00030 SPSASOOptimizer
00031 ::SPSASOOptimizer()
00032 {
00033 m_ItkOptimizer = ItkOptimizerType::New();
00034 m_CostFunctionWrapper = ItkSingleValuedCostFunctionWrapper::New();
00035
00036 m_ValueUpdateRate = 10;
00037
00038 this->SetMaximize(false);
00039
00040 m_IterationObserver = IterationObserver::New();
00041 m_IterationNotificationEvent = NotificationEvent<Self>::New(this, &Self::OnOptIteration);
00042 m_IterationObserver->fnOnNotify = m_IterationNotificationEvent;
00043 m_ItkOptimizer->AddObserver(itk::IterationEvent(), m_IterationObserver);
00044
00045 m_StartObserver = StartObserver::New();
00046 m_StartNotificationEvent = NotificationEvent<Self>::New(this, &Self::OnOptStart);
00047 m_StartObserver->fnOnNotify = m_StartNotificationEvent;
00048 m_ItkOptimizer->AddObserver(itk::StartEvent(), m_StartObserver);
00049
00050 m_EndObserver = EndObserver::New();
00051 m_EndNotificationEvent = NotificationEvent<Self>::New(this, &Self::OnOptEnd);
00052 m_EndObserver->fnOnNotify = m_EndNotificationEvent;
00053 m_ItkOptimizer->AddObserver(itk::EndEvent(), m_EndObserver);
00054 }
00055
00056 void
00057 SPSASOOptimizer::
00058 GuessParameters( unsigned long numberOfGradientEstimates,
00059 double initialStepSize)
00060 {
00061 this->m_ItkOptimizer->GuessParameters(numberOfGradientEstimates,initialStepSize);
00062 };
00063
00064 void
00065 SPSASOOptimizer::
00066 SetCostFunction( CostFunctionType * costFunction )
00067 {
00068 Superclass::SetCostFunction(costFunction);
00069 m_CostFunctionWrapper->SetWrappedCostFunction(costFunction);
00070 m_ItkOptimizer->SetCostFunction(m_CostFunctionWrapper);
00071 };
00072
00073 void
00074 SPSASOOptimizer::
00075 SetInitialPosition (const ParametersType ¶m)
00076 {
00077 Superclass::SetInitialPosition(param);
00078 m_ItkOptimizer->SetInitialPosition(param);
00079 };
00080
00081 void
00082 SPSASOOptimizer
00083 ::PrintSelf(std::ostream& os, itk::Indent indent) const
00084 {
00085 Superclass::PrintSelf(os,indent);
00086
00087 os << indent << "a: " << this->m_ItkOptimizer->Geta() << std::endl;
00088 os << indent << "A: " << this->m_ItkOptimizer->GetA() << std::endl;
00089 os << indent << "Alpha: " << this->m_ItkOptimizer->GetAlpha() << std::endl;
00090 os << indent << "c: " << this->m_ItkOptimizer->Getc() << std::endl;
00091 os << indent << "Gamma: " << this->m_ItkOptimizer->GetGamma() << std::endl;
00092
00093 os << indent << "NumberOfPerturbations: " << this->m_ItkOptimizer->GetNumberOfPerturbations() << std::endl;
00094
00095 os << indent << "LearningRate: " << this->m_ItkOptimizer->GetLearningRate() << std::endl;
00096
00097 os << indent << "MaximumNumberOfIterations: " << this->m_ItkOptimizer->GetMaximumNumberOfIterations() << std::endl;
00098 os << indent << "MinimumNumberOfIterations: " << this->m_ItkOptimizer->GetMinimumNumberOfIterations() << std::endl;
00099 os << indent << "ValueUpdateRate: " << this->m_ValueUpdateRate << std::endl;
00100
00101 os << indent << "Maximize: " << this->m_ItkOptimizer->GetMaximize() << std::endl;
00102 os << indent << "StopCondition: " << this->m_ItkOptimizer->GetStopCondition() << std::endl;
00103
00104 os << indent << "Current Iteration " << this->m_ItkOptimizer->GetCurrentIteration() << std::endl;
00105 os << indent << "Current Cost " << this->GetCurrentValue() << std::endl;
00106 }
00107
00108 void
00109 SPSASOOptimizer
00110 ::StartOptimization( void )
00111 {
00112 this->m_ItkOptimizer->SetScales(this->GetScales());
00113 this->m_ItkOptimizer->StartOptimization();
00114
00115 this->m_CurrentValue = this->m_ItkOptimizer->GetValue();
00116 this->m_CurrentDecomposedValue = this->m_CostFunction->GetCurrentDecomposedValue();
00117
00118 this->m_BestValue = this->m_CurrentValue;
00119 this->m_BestPosition = this->m_ItkOptimizer->GetCurrentPosition();
00120 }
00121
00122 bool
00123 SPSASOOptimizer
00124 ::IsStoppable() const
00125 {
00126 return true;
00127 };
00128
00129
00130 void
00131 SPSASOOptimizer
00132 ::StopOptimization()
00133 {
00134 this->m_ItkOptimizer->StopOptimization();
00135 };
00136
00137 bool
00138 SPSASOOptimizer
00139 ::IsResumeable() const
00140 {
00141 return true;
00142 };
00143
00144 void
00145 SPSASOOptimizer
00146 ::ResumeOptimization()
00147 {
00148 this->m_ItkOptimizer->ResumeOptimization();
00149 };
00150
00151 SPSASOOptimizer::ItkOptimizerType *
00152 SPSASOOptimizer
00153 ::GetItkOptimizer()
00154 {
00155 return m_ItkOptimizer;
00156 }
00157
00158 void
00159 SPSASOOptimizer::
00160 OnOptIteration(void* pSender, long threadID)
00161 {
00162 if (this->m_ItkOptimizer->GetCurrentIteration()%m_ValueUpdateRate == 0)
00163 {
00164
00165 this->m_CurrentValue = this->m_ItkOptimizer->GetValue();
00166 this->m_CurrentDecomposedValue = this->m_CostFunction->GetCurrentDecomposedValue();
00167
00168 this->m_BestValue = this->m_CurrentValue;
00169 this->m_BestPosition = this->m_ItkOptimizer->GetCurrentPosition();
00170 };
00171
00172 this->SetCurrentPosition(this->m_ItkOptimizer->GetCurrentPosition());
00173
00174
00175
00176 this->InvokeEvent( itk::IterationEvent() );
00177 };
00178
00179 void
00180 SPSASOOptimizer::
00181 OnOptStart(void* pSender, long threadID)
00182 {
00183
00184 this->InvokeEvent( itk::StartEvent() );
00185 };
00186
00187 void
00188 SPSASOOptimizer::
00189 OnOptEnd(void* pSender, long threadID)
00190 {
00191
00192 this->InvokeEvent( itk::EndEvent() );
00193 };
00194
00195 }
00196
00197