15 #ifndef __itkSuperEllipseFit_h
16 #define __itkSuperEllipseFit_h
18 #include <itkMultipleValuedCostFunction.h>
19 #include <itkLevenbergMarquardtOptimizer.h>
21 #include <vnl/vnl_vector.h>
22 #include <vnl/vnl_matrix.h>
23 #include <vnl/vnl_math.h>
26 #include <itkArray2D.h>
38 class ITK_EXPORT Index2D :
public itk::Index< 2 >
41 this->m_Index[0] = 0.;
42 this->m_Index[1] = 0.;
45 Index2D operator=(
const Index2D &newIndex) {
47 for (
unsigned int i = 0; i <
Dimension; i++ )
49 m_Index[i] = newIndex.m_Index[i];
74 enum { NumberOfParameters = 5 };
90 m_NumberOfDataPoints = inputData.size();
92 m_Measure.SetSize( m_NumberOfDataPoints );
93 m_Derivative.SetSize( NumberOfParameters, m_NumberOfDataPoints );
98 MeasureType
GetValue(
const ParametersType ¶meters )
const override
102 double A = parameters[0];
103 double B = parameters[1];
104 double C = parameters[2];
105 double D = parameters[3];
106 double E = parameters[4];
111 unsigned int iPoint = 0;
113 std::deque< Index2D >::const_iterator itData = m_Data.begin();
115 while ( itData != m_Data.end() )
120 m_Measure[ iPoint ] = A*x*x + B*y*y + C*x + D*y + E;
130 DerivativeType &derivative )
const override
132 unsigned int iPoint = 0;
137 std::deque< Index2D >::const_iterator itData = m_Data.begin();
139 while ( itData != m_Data.end() )
144 m_Derivative[0][iPoint] = x*
x;
145 m_Derivative[1][iPoint] = y*
y;
146 m_Derivative[2][iPoint] =
x;
147 m_Derivative[3][iPoint] =
y;
148 m_Derivative[4][iPoint] = 1.0;
151 derivative = m_Derivative;
159 return NumberOfParameters;
164 return m_NumberOfDataPoints;
175 unsigned int m_NumberOfDataPoints;
177 mutable MeasureType m_Measure;
178 mutable DerivativeType m_Derivative;
206 Execute( (
const Object *)caller, event);
209 void Execute(
const Object *
object,
const EventObject &
event)
override
211 std::cout <<
"Observer::Execute() " << std::endl;
212 OptimizerPointer optimizer =
213 dynamic_cast< OptimizerPointer
>( object );
214 if( m_FunctionEvent.CheckEvent( &event ) )
216 std::cout << m_IterationNumber++ <<
" ";
217 std::cout << optimizer->GetCachedValue() <<
" ";
218 std::cout << optimizer->GetCachedCurrentPosition() << std::endl;
220 else if( m_GradientEvent.CheckEvent( &event ) )
222 std::cout <<
"Gradient " << optimizer->GetCachedDerivative() <<
" ";
227 unsigned long m_IterationNumber;
229 FunctionEvaluationIterationEvent m_FunctionEvent;
230 GradientEvaluationIterationEvent m_GradientEvent;
239 bool useGradient =
true,
240 double fTolerance = 1e-2,
241 double gTolerance = 1e-2,
242 double xTolerance = 1e-5,
243 double epsilonFunction = 1e-9,
244 int maxIterations = 200 )
246 std::cout <<
"Levenberg Marquardt optimisation \n \n";
248 typedef LevenbergMarquardtOptimizer OptimizerType;
250 typedef OptimizerType::InternalOptimizerType vnlOptimizerType;
253 OptimizerType::Pointer optimizer = OptimizerType::New();
258 costFunction->SetData( data );
263 parameters.Fill( 0.0 );
264 costFunction->GetValue(parameters);
266 std::cout <<
"Number of Values = " << costFunction->GetNumberOfValues() <<
"\n";
270 optimizer->SetCostFunction( costFunction.GetPointer() );
272 catch( ExceptionObject & e )
274 std::cout <<
"Exception thrown ! " << std::endl;
275 std::cout <<
"An error ocurred during Optimization" << std::endl;
276 std::cout << e << std::endl;
281 optimizer->GetUseCostFunctionGradient();
282 optimizer->UseCostFunctionGradientOn();
283 optimizer->UseCostFunctionGradientOff();
284 optimizer->SetUseCostFunctionGradient( useGradient );
287 vnlOptimizerType * vnlOptimizer = optimizer->GetOptimizer();
289 vnlOptimizer->set_f_tolerance( fTolerance );
290 vnlOptimizer->set_g_tolerance( gTolerance );
291 vnlOptimizer->set_x_tolerance( xTolerance );
292 vnlOptimizer->set_epsilon_function( epsilonFunction );
293 vnlOptimizer->set_max_function_evals( maxIterations );
299 initialValue[0] = 10;
300 initialValue[1] = 20;
301 initialValue[2] = 100;
302 initialValue[3] = 200;
307 currentValue = initialValue;
309 optimizer->SetInitialPosition( currentValue );
313 optimizer->AddObserver( IterationEvent(), observer );
314 optimizer->AddObserver( FunctionEvaluationIterationEvent(), observer );
318 optimizer->StartOptimization();
320 catch( ExceptionObject & e )
322 std::cerr <<
"Exception thrown ! " << std::endl;
323 std::cerr <<
"An error ocurred during Optimization" << std::endl;
324 std::cerr <<
"Location = " << e.GetLocation() << std::endl;
325 std::cerr <<
"Description = " << e.GetDescription() << std::endl;
331 std::cout <<
"End condition = ";
332 switch( vnlOptimizer->get_failure_code() )
334 case vnl_nonlinear_minimizer::ERROR_FAILURE:
335 std::cout <<
" Error Failure";
break;
336 case vnl_nonlinear_minimizer::ERROR_DODGY_INPUT:
337 std::cout <<
" Error Dogy Input";
break;
338 case vnl_nonlinear_minimizer::CONVERGED_FTOL:
339 std::cout <<
" Converged F Tolerance";
break;
340 case vnl_nonlinear_minimizer::CONVERGED_XTOL:
341 std::cout <<
" Converged X Tolerance";
break;
342 case vnl_nonlinear_minimizer::CONVERGED_XFTOL:
343 std::cout <<
" Converged XF Tolerance";
break;
344 case vnl_nonlinear_minimizer::CONVERGED_GTOL:
345 std::cout <<
" Converged G Tolerance";
break;
346 case vnl_nonlinear_minimizer::FAILED_TOO_MANY_ITERATIONS:
347 std::cout <<
" Too many iterations ";
break;
348 case vnl_nonlinear_minimizer::FAILED_FTOL_TOO_SMALL:
349 std::cout <<
" Failed F Tolerance too small ";
break;
350 case vnl_nonlinear_minimizer::FAILED_XTOL_TOO_SMALL:
351 std::cout <<
" Failed X Tolerance too small ";
break;
352 case vnl_nonlinear_minimizer::FAILED_GTOL_TOO_SMALL:
353 std::cout <<
" Failed G Tolerance too small ";
break;
354 case vnl_nonlinear_minimizer::FAILED_USER_REQUEST:
355 std::cout <<
" Failed user request ";
break;
357 std::cout << std::endl;
358 std::cout <<
"Number of iters = " << vnlOptimizer->get_num_iterations() << std::endl;
359 std::cout <<
"Number of evals = " << vnlOptimizer->get_num_evaluations() << std::endl;
360 std::cout << std::endl;
363 OptimizerType::ParametersType finalPosition;
364 finalPosition = optimizer->GetCurrentPosition();
366 std::cout <<
"Solution = (";
367 std::cout << finalPosition[0] <<
"," ;
368 std::cout << finalPosition[1] <<
"," ;
369 std::cout << finalPosition[2] <<
"," ;
370 std::cout << finalPosition[3] <<
"," ;
371 std::cout << finalPosition[4] <<
")" << std::endl;
std::deque< Index2D > DataType
Definition: itkSuperEllipseFit.h:82
int SuperEllipseFit(SuperEllipseFitMetric::DataType &data, bool useGradient=true, double fTolerance=1e-2, double gTolerance=1e-2, double xTolerance=1e-5, double epsilonFunction=1e-9, int maxIterations=200)
Definition: itkSuperEllipseFit.h:238
SmartPointer< Self > Pointer
Definition: itkSuperEllipseFit.h:193
MeasureType GetValue(const ParametersType ¶meters) const override
Definition: itkSuperEllipseFit.h:98
LevenbergMarquardtOptimizer OptimizerType
Definition: itkSuperEllipseFit.h:201
itk::Index< 2 > Index2D
Definition: itkSuperEllipseFit.h:80
DataType m_Data
Definition: itkSuperEllipseFit.h:170
unsigned int GetNumberOfParameters(void) const override
Definition: itkSuperEllipseFit.h:157
SmartPointer< Self > Pointer
Definition: itkSuperEllipseFit.h:69
CommandIterationUpdateSuperEllipseFit()
Definition: itkSuperEllipseFit.h:196
MultipleValuedCostFunction Superclass
Definition: itkSuperEllipseFit.h:68
GLint GLint GLint GLint GLint GLint y
Definition: glew.h:1236
CommandIterationUpdateSuperEllipseFit Self
Definition: itkSuperEllipseFit.h:191
Definition: niftkITKAffineResampleImage.cxx:74
GLint GLenum GLsizei GLint GLsizei const GLvoid * data
Definition: glew.h:1363
vnl_matrix< double > MatrixType
Definition: itkSuperEllipseFit.h:32
Definition: itkSuperEllipseFit.h:62
vnl_vector< double > VectorType
Definition: itkSuperEllipseFit.h:33
Superclass::DerivativeType DerivativeType
Definition: itkSuperEllipseFit.h:77
SmartPointer< const Self > ConstPointer
Definition: itkSuperEllipseFit.h:70
SuperEllipseFitMetric(void)
Definition: itkSuperEllipseFit.h:84
Definition: itkSuperEllipseFit.h:74
Definition: itkSuperEllipseFit.h:188
Command Superclass
Definition: itkSuperEllipseFit.h:192
Superclass::MeasureType MeasureType
Definition: itkSuperEllipseFit.h:78
void SetData(DataType &inputData)
Definition: itkSuperEllipseFit.h:88
void Execute(Object *caller, const EventObject &event) override
Definition: itkSuperEllipseFit.h:204
GLint GLint GLint GLint GLint x
Definition: glew.h:1236
Superclass::ParametersType ParametersType
Definition: itkSuperEllipseFit.h:76
SuperEllipseFitMetric Self
Definition: itkSuperEllipseFit.h:66
void Execute(const Object *object, const EventObject &event) override
Definition: itkSuperEllipseFit.h:209
const OptimizerType * OptimizerPointer
Definition: itkSuperEllipseFit.h:202
const unsigned int Dimension
Definition: niftkBreastDCEandADC.cxx:89
cl_event event
Definition: glew.h:3231
unsigned int GetNumberOfValues(void) const override
Definition: itkSuperEllipseFit.h:162
void GetDerivative(const ParametersType ¶meters, DerivativeType &derivative) const override
Definition: itkSuperEllipseFit.h:129