00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "frePowellSOOptimizer.h"
00024 #include "itkCommand.h"
00025 #include "itkEventObject.h"
00026
00027 namespace FREE
00028 {
00029
00030 PowellSOOptimizer
00031 ::PowellSOOptimizer()
00032 {
00033 m_ItkOptimizer = ItkOptimizerType::New();
00034 m_CostFunctionWrapper = ItkSingleValuedCostFunctionWrapper::New();
00035
00036 this->SetMaximize(false);
00037 this->SetMaximumIteration(100);
00038 this->SetMaximumLineIteration(100);
00039 this->SetStepLength(1.0);
00040 this->SetStepTolerance(0.00001);
00041 this->SetValueTolerance(0.00001);
00042
00043 m_IterationObserver = IterationObserver::New();
00044 m_IterationNotificationEvent = NotificationEvent<Self>::New(this, &Self::OnOptIteration);
00045 m_IterationObserver->fnOnNotify = m_IterationNotificationEvent;
00046 m_ItkOptimizer->AddObserver(itk::IterationEvent(), m_IterationObserver);
00047
00048 m_StartObserver = StartObserver::New();
00049 m_StartNotificationEvent = NotificationEvent<Self>::New(this, &Self::OnOptStart);
00050 m_StartObserver->fnOnNotify = m_StartNotificationEvent;
00051 m_ItkOptimizer->AddObserver(itk::StartEvent(), m_StartObserver);
00052
00053 m_EndObserver = EndObserver::New();
00054 m_EndNotificationEvent = NotificationEvent<Self>::New(this, &Self::OnOptEnd);
00055 m_EndObserver->fnOnNotify = m_EndNotificationEvent;
00056 m_ItkOptimizer->AddObserver(itk::EndEvent(), m_EndObserver);
00057 }
00058
00059 PowellSOOptimizer
00060 ::~PowellSOOptimizer()
00061 {
00062 }
00063
00064 void
00065 PowellSOOptimizer::
00066 SetMaximize(bool maximize)
00067 {
00068 m_ItkOptimizer->SetMaximize(maximize);
00069 this->Modified();
00070 };
00071
00072 void
00073 PowellSOOptimizer::
00074 SetMaximumIteration(unsigned int iMaximumIteration)
00075 {
00076 m_ItkOptimizer->SetMaximumIteration(iMaximumIteration);
00077 this->Modified();
00078 };
00079
00080 const unsigned int
00081 PowellSOOptimizer::
00082 GetMaximumIteration() const
00083 {
00084 return m_ItkOptimizer->GetMaximumIteration();
00085 };
00086
00087 void
00088 PowellSOOptimizer::
00089 SetMaximumLineIteration(unsigned int iMaximumLineIteration)
00090 {
00091 m_ItkOptimizer->SetMaximumLineIteration(iMaximumLineIteration);
00092 this->Modified();
00093 };
00094
00095 const unsigned int
00096 PowellSOOptimizer::
00097 GetMaximumLineIteration() const
00098 {
00099 return m_ItkOptimizer->GetMaximumLineIteration();
00100 };
00101
00102 void
00103 PowellSOOptimizer::
00104 SetStepLength(double dStepLenght)
00105 {
00106 m_ItkOptimizer->SetStepLength(dStepLenght);
00107 this->Modified();
00108 };
00109
00110 const double&
00111 PowellSOOptimizer::
00112 GetStepLength() const
00113 {
00114 return m_ItkOptimizer->GetStepLength();
00115 };
00116
00117 void
00118 PowellSOOptimizer::
00119 SetStepTolerance(double dStepTolerance)
00120 {
00121 m_ItkOptimizer->SetStepTolerance(dStepTolerance);
00122 this->Modified();
00123 };
00124
00125 const double&
00126 PowellSOOptimizer::
00127 GetStepTolerance() const
00128 {
00129 return m_ItkOptimizer->GetStepTolerance();
00130 };
00131
00132 void
00133 PowellSOOptimizer::
00134 SetValueTolerance(double dValueTolerance)
00135 {
00136 m_ItkOptimizer->SetValueTolerance(dValueTolerance);
00137 this->Modified();
00138 };
00139
00140 const double&
00141 PowellSOOptimizer::
00142 GetValueTolerance() const
00143 {
00144 return m_ItkOptimizer->GetValueTolerance();
00145 };
00146
00147 void
00148 PowellSOOptimizer::
00149 SetCostFunction( CostFunctionType * costFunction )
00150 {
00151 Superclass::SetCostFunction(costFunction);
00152 m_CostFunctionWrapper->SetWrappedCostFunction(costFunction);
00153 m_ItkOptimizer->SetCostFunction(m_CostFunctionWrapper);
00154 };
00155
00156 void
00157 PowellSOOptimizer::
00158 SetInitialPosition (const ParametersType ¶m)
00159 {
00160 Superclass::SetInitialPosition(param);
00161 m_ItkOptimizer->SetInitialPosition(param);
00162 };
00163
00164 void
00165 PowellSOOptimizer
00166 ::PrintSelf(std::ostream& os, itk::Indent indent) const
00167 {
00168 Superclass::PrintSelf(os,indent);
00169
00170 os << indent << "Current Iteration " << m_ItkOptimizer->GetCurrentIteration() << std::endl;
00171 os << indent << "Maximize On/Off " << m_ItkOptimizer->GetMaximize() << std::endl;
00172 os << indent << "StepLength " << m_ItkOptimizer->GetStepLength() << std::endl;
00173 os << indent << "StepTolerance " << m_ItkOptimizer->GetStepTolerance() << std::endl;
00174 os << indent << "ValueTolerance " << m_ItkOptimizer->GetValueTolerance() << std::endl;
00175 os << indent << "Current Cost " << m_ItkOptimizer->GetCurrentCost() << std::endl;
00176 os << indent << "Maximum Line Iteration " << m_ItkOptimizer->GetMaximumLineIteration() << std::endl;
00177 os << indent << "Current Line Iteration " << m_ItkOptimizer->GetCurrentLineIteration() << std::endl;
00178 }
00179
00180 void
00181 PowellSOOptimizer
00182 ::StartOptimization( void )
00183 {
00184 this->m_ItkOptimizer->SetScales(this->GetScales());
00185 this->m_ItkOptimizer->StartOptimization();
00186 }
00187
00188 void
00189 PowellSOOptimizer
00190 ::StopOptimization()
00191 {
00192 this->m_ItkOptimizer->StopOptimization();
00193 };
00194
00195 bool
00196 PowellSOOptimizer
00197 ::IsStoppable() const
00198 {
00199 return true;
00200 };
00201
00202
00203 PowellSOOptimizer::ItkOptimizerType *
00204 PowellSOOptimizer
00205 ::GetItkOptimizer()
00206 {
00207 return m_ItkOptimizer;
00208 }
00209
00210 void
00211 PowellSOOptimizer::
00212 OnOptIteration(void* pSender, long threadID)
00213 {
00214 this->m_CurrentValue = this->m_ItkOptimizer->GetCurrentCost();
00215 this->m_CurrentDecomposedValue = this->m_CostFunction->GetCurrentDecomposedValue();
00216 this->SetCurrentPosition(this->m_ItkOptimizer->GetCurrentPosition());
00217
00218
00219 m_BestValue = m_CurrentValue;
00220 m_BestPosition = this->m_ItkOptimizer->GetCurrentPosition();
00221
00222
00223 this->InvokeEvent( itk::IterationEvent() );
00224 };
00225
00226 void
00227 PowellSOOptimizer::
00228 OnOptStart(void* pSender, long threadID)
00229 {
00230
00231 this->InvokeEvent( itk::StartEvent() );
00232 };
00233
00234 void
00235 PowellSOOptimizer::
00236 OnOptEnd(void* pSender, long threadID)
00237 {
00238
00239 this->InvokeEvent( itk::EndEvent() );
00240 };
00241
00242 }
00243
00244